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

来源:这里教程网 时间:2026-02-21 17:43:16 作者:

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 自动加的千位分隔符……这些细节往往在上线后才暴露。

相关推荐

热文推荐