C#读写CSV文件 C#如何解析和生成CSV文件

2次阅读

textfieldparser 更安全但仅限 windows/.net framework;跨平台或新版本推荐 csvhelper;手写需处理引号转义、空格和空行;极致性能可用 span 解析。

C#读写CSV文件 C#如何解析和生成CSV文件

TextFieldParser 读取 CSV 更安全,但仅限 Windows/.NET Framework

直接用 String.Split(',') 解析 CSV 是常见误区——遇到带逗号的字段(如 "Smith, John")、换行符或转义引号时会崩。微软内置的 microsoft.VisualBasic.FileIO.TextFieldParser 能正确处理这些情况,但它默认只在 .NET Framework 和 Windows 上可用(.NET Core/.NET 5+ 需额外安装 Microsoft.VisualBasic.Core 包)。

实操建议:

  • 若项目锁定 Windows 且用 .NET Framework,优先用 TextFieldParser:它自动识别引号包裹、跳过空行、支持自定义分隔符
  • 若跨平台或用 .NET 6+,别硬凑 TextFieldParser,改用成熟第三方库(见下一条)
  • 注意:该类在 Microsoft.VisualBasic 命名空间下,C# 项目需手动添加对 Microsoft.VisualBasic.dll 的引用(或 NuGet 包)

推荐用 CsvHelper 处理任意复杂度的 CSV

CsvHelper 是目前 C# 生态中最可靠、文档最清晰的 CSV 库,支持映射到强类型对象、自定义转换、异步读写、不同编码和分隔符,且完全跨平台。

实操建议:

  • 安装:dotnet add package CsvHelper
  • 读 CSV 到对象列表:确保类属性名与 CSV 头部列名一致,或用 [Name("Full Name")] 特性标注
  • 写 CSV 时,context.WriteRecords(list) 自动处理字段内换行、引号、特殊字符——不用自己拼接
  • 中文乱码?构造 StreamReader/StreamWriter 时显式传入 Encoding.UTF8,别依赖默认编码

示例(读取):

using (var reader = new StreamReader("data.csv", Encoding.UTF8)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) {     var records = csv.GetRecords<Person>().ToList(); }

手写 CSV 写入器要注意的三个坑

如果因极简需求或合规限制必须手写,以下三点不处理就会出错:

  • 字段含 ", 或换行符时,必须用双引号包裹,且内部引号要转义为两个引号("""
  • 整行不能以空格开头(某些 excel 版本会误判为公式,弹警告),写入前用 TrimStart() 清理
  • 文件末尾多一个空行是常见现象,但某些嵌入式系统解析器会报错;写完后检查最后一行是否为空,必要时截断

性能敏感场景下,Span<char></char> + 手动解析比通用库快 3–5 倍

当单次处理百万行以上、且 CSV 格式严格(无引号、无换行、ASCII 字段),用 Span<char></char> 逐字符扫描比 CsvHelper 快得多,内存零分配。

实操建议:

  • 只适用于已知格式干净的内部数据交换,切勿用于用户上传的 CSV
  • 核心逻辑:用 ReadOnlySpan<char>.IndexOf(',') </char>找分隔符,用 slice 截取字段,跳过引号逻辑可直接省略
  • 注意:.NET Core 2.1+ 才支持完整 Span API,旧框架无法使用

真正难的不是读写动作本身,而是判断「这个 CSV 到底有多脏」——字段里有没有隐藏的 bom、制表符混在分隔符位置、Excel 自动加的千位分隔符……这些细节往往在上线后才暴露。

text=ZqhQzanResources