用 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+ 才支持完整
SpanAPI,旧框架无法使用
真正难的不是读写动作本身,而是判断「这个 CSV 到底有多脏」——字段里有没有隐藏的 BOM、制表符混在分隔符位置、Excel 自动加的千位分隔符……这些细节往往在上线后才暴露。
