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

用 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,别依赖默认编码
示例(读取):
本文档主要讲述的是使用JSON进行网络数据交换传输;JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON的数据格式非常简单,您可以用 JSON 传输一个简单的 St
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 自动加的千位分隔符……这些细节往往在上线后才暴露。









