如何读取 CSV 文件 [重复]

Posted

技术标签:

【中文标题】如何读取 CSV 文件 [重复]【英文标题】:How to Read CSV file [duplicate] 【发布时间】: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 示例...有些相当广泛...但是它易于使用和学习 【参考方案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 解析器的好处是: 可以逐行处理

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

【讨论】:

以上是关于如何读取 CSV 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何读取csv文件和excel文件python? [关闭]

我如何读取大的csv(20G)[重复]

同时读取几个.csv文件[重复]

如何找到由拆分函数创建的数组的长度[重复]

UnicodeDecodeError:('utf-8'编解码器)在读取csv文件时[重复]

从 csv 文件中读取数据需要很长时间 [重复]