如何读取 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 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章