【问题标题】:How to Read CSV file [duplicate]如何读取 CSV 文件 [重复]
【发布时间】:2021-07-28 08:44:30
【问题描述】:

我有一个大的 CSV 文件 (200 MB)

ID,Item,Description
1,TV,"Excellent condition, no marks, and brand new"
2,PC, "Used, missing keyboard"
....

我需要将其放入数据表中,以便在我的 C# Windows 窗体应用程序中构建 TreeView 和 GridView。

我找到了很多这样做的例子..

一种方法是使用 System.IO

using System.IO.File;

return ReadAllLines(@"C:\MyFile.csv").Select(line => line.Split(',')).ToList();

另一种方法是使用 GenericParsing

        var adapter = new GenericParsing.GenericParserAdapter(path);
        DataTable dt = adapter.GetDataTable();

方法1有一个问题是它用分隔符“,”分割列

这是一个问题,因为在我的文件中,逗号可以作为字符出现在同一列中,而不是作为分隔符

第二种方法需要高内存并且由于这个错误而失败

此异常最初是在此调用堆栈中引发的: [外部代码] FrmCoder.cs 中的 Encoder.FrmCoder.GetDataTableFromCsv(string, bool) FrmCoder.cs 中的 Encoder.FrmCoder.FrmCoder_Load(object, System.EventArgs) [外部代码]

任何其他方法可以轻松加载大文件而不会出现问题?

【问题讨论】:

  • 我从未使用过 GenericParsing,但如果用于读取 CSV 文件的库无法处理出现在引用单元格值中的分隔符,我会感到惊讶。也许您应该尝试使用更常用的 CsvHeper.io。
  • 不要自己尝试这样做。使用 CSVHelper。 CSV 文件有很多你不会想到的极端情况。
  • @Andy 有什么关于如何使用 CsvHlper 的好例子吗?
  • 非常easy to use
  • 这里有 数千个 CSVHelper 示例...有些相当广泛...但是它易于使用和学习

标签: c# csv


【解决方案1】:

TextFieldParser 命名空间中有一个类 TextFieldParser

这个类可以这样配置:

using TextFieldParser parser = new TextFieldParser(stream)
{
    Delimiters = new[] { "," },
    HasFieldsEnclosedInQuotes = true,
    TextFieldType = FieldType.Delimited,
    TrimWhiteSpace = true,
};

解析器的使用:

while (!parser.EndOfData)
{
    var fields = parser.ReadFields() ?? throw new InvalidOperationException("Parser unexpectedly returned no data");
    
    // your code 
}

如前所述,使用 CSV 解析器的好处是: 可以逐行处理

内存消耗极低,因为您是按顺序读取文件而不是将所有内容都加载到内存中。

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2016-06-07
    • 2017-05-01
    • 2013-04-03
    • 2013-01-21
    • 2020-01-30
    • 2021-10-06
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多