C# 如何读取CSV文件
我有一个大的CSV文件(200 MB) 我需要把它放到一个数据表中,这样在我的C#Windows窗体应用程序中,我就可以构建一个TreeView和GridView 我找到了很多这样做的例子 一种方法是使用System.IOC# 如何读取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
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
}