C# 如何读取CSV文件

C# 如何读取CSV文件,c#,csv,C#,Csv,我有一个大的CSV文件(200 MB) 我需要把它放到一个数据表中,这样在我的C#Windows窗体应用程序中,我就可以构建一个TreeView和GridView 我找到了很多这样做的例子 一种方法是使用System.IO using System.IO.File; return ReadAllLines(@"C:\MyFile.csv").Select(line => line.Split(',')).ToList(); 另一种方法是使用GenericParsin

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

我需要把它放到一个数据表中,这样在我的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的一个问题是,它通过delimeter“,”拆分列

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

第二种方法需要高内存,但由于此错误而失败

此异常最初是在此调用堆栈中引发的: [外部代码] FrmCoder.cs中的Encoder.FrmCoder.GetDataTableFromCsv(字符串,bool) FrmCoder.cs中的编码器.FrmCoder.FrmCoder\u加载(对象,系统.EventArgs) [外部代码]


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

Microsoft.VisualBasic.FileIO
命名空间中有一个类
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解析器的好处是: 您可以逐行处理


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

我从未使用过GenericParsing,但如果用于读取CSV文件的库无法处理带引号的单元格值中出现的分隔符,我会感到惊讶。也许你应该试试更常用的CsvHeper.io,不要自己尝试。使用CSVHelper。CSV文件的边缘案例太多了,你想不起来。@Andy有没有关于如何使用CsvHlper的好例子?非常好。这里有数千个CSVHelper示例……有些非常广泛……但是是的,它很容易使用和学习
while (!parser.EndOfData)
{
    var fields = parser.ReadFields() ?? throw new InvalidOperationException("Parser unexpectedly returned no data");
    
    // your code 
}