c# - 在 C# 中读取 CSV 文件

标签 c# excel csv exceldatareader

我有以下代码可以导入 excel 文档并对其进行解析,以便在将数据保存到数据库之前对其进行操作。

我可以很好地解析 .xlsx 和 .xls 文件,但无法弄清楚如何将现有代码用于 .csv 文件

我工作的客户想要使用 .csv 文件类型来接受特殊字符。

OpenFileDialog opener = new OpenFileDialog();
opener.Filter = "Excel Files| *.xlsx;*.xls;*.csv;";
if (opener.ShowDialog() == DialogResult.Cancel)
    return;

FileStream streamer = new FileStream(opener.FileName, FileMode.Open);
IExcelDataReader reader;
if (Path.GetExtension(opener.FileName) == ".xls")
{
    reader = ExcelReaderFactory.CreateBinaryReader(streamer);
}
else if (Path.GetExtension(opener.FileName) == ".csv")
{

    *** Need Something Here to read CSV Files that will work with 
        the rest of code***
}
else
{
    reader = ExcelReaderFactory.CreateOpenXmlReader(streamer);
}
DataSet results = reader.AsDataSet();
results.Tables[0].Rows[0].Delete();
results.AcceptChanges();


foreach (System.Data.DataTable table in results.Tables)
{
    foreach (DataRow dr in table.Rows)
    {
       >>> Do Something With the Data
    }
}

最佳答案

假设您的 IExcelDataReader是一个读取 Excel 文件的第三方包(一个相当安全的选择),它本身不处理 CSV(我不确定那部分),那么你总是可以完全单独处理 CSV。

OLE 有一个不错的 CSV 阅读器,所以这样的东西应该可以工作。

List<DataTable> tables = new List<DataTable>();

if (Path.GetExtension(opener.FileName) == ".csv")
{
    OleDbConnection conn = new OleDbConnection(string.Format(
        @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};" +
        "Extended Properties=\"Text;HDR=YES;FMT=Delimited\"",
        opener.FileName
    ));
    conn.Open();

    string sql = string.Format("select * from [{0}]", Path.GetFileName(opener.FileName));
    OleDbCommand cmd = new OleDbCommand(sql, conn);
    OleDbDataReader reader = cmd.ExecuteReader();

    DataTable dt = new DataTable();
    dt.Load(reader);
    tables.Add(dt);

    reader.Close();
}
else
{
    FileStream streamer = new FileStream(opener.FileName, FileMode.Open);
    IExcelDataReader reader = null;
    if (Path.GetExtension(opener.FileName) == ".xls")
        reader = ExcelReaderFactory.CreateBinaryReader(streamer);
    else
        reader = ExcelReaderFactory.CreateOpenXmlReader(streamer);
    DataSet results = reader.AsDataSet();
    results.Tables[0].Rows[0].Delete();
    results.AcceptChanges();

    foreach (DataTable table in results.Tables)
        tables.Add(table);
}

然后只需引用您的本地数据表列表 ( tables ) 而不是 Results.Tables,因为现在本地范围为 IExcelReader .
foreach (System.Data.DataTable table in tables)
{
    foreach (DataRow dr in table.Rows)
    {
       >>> Do Something With the Data
    }
}

如果由于某种原因不能使用 OLE,.NET 类库实际上有一个 CSV 解析器。在我看来,它隐藏得很好,但很好:

http://odedcoster.com/blog/2012/03/28/did-you-know-a-net-csv-parser-that-comes-with-visual-studio/

关于c# - 在 C# 中读取 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41689933/

相关文章:

c# - 如何从 MVVM 中的 ViewModel 访问用户控件(工具栏)?

python - "UnicodeEncodeError: ' charmap ' codec can' t 编码字符”尝试通过 openpyxl 解析 .xlsx 时

csv - OpenOffice导出CSV时下划线替换为 "+AF8-"

c# - 仅从数字中删除双引号

c# - liskov替换原则和异常处理

c# - ASP.NET 核心 : Exclude or include files on publish

vba - 工作表选择更改不起作用

excel - VBA - 使用指定的顺序进行决胜局

linux - while 循环中的 awk 命令问题

linux - 当定界符也出现在文件中任何位置的字段数据中时,如何替换定界符?