TextFieldParser 是 .NET 原生最稳的 CSV 解析器,需配 StreamReader 流式读取、显式设编码及 HasFieldsEnclosedInQuotes = true,否则字段含引号或换行会错位。

TextFieldParser 是 .NET 原生最稳的 CSV 解析器,但必须配对用 StreamReader 流式传入、显式设编码和 HasFieldsEnclosedInQuotes = true,否则字段含引号或换行时直接错位。
TextFieldParser 为什么比 string.Split(',') 可靠
CSV 不是简单逗号切分——字段里带逗号、双引号、换行符都合法,只要被双引号包裹。比如 "张三,工程师" 或 "地址:北京市\n朝阳区",string.Split(',') 会把前者切成两段、后者断成两行。
TextFieldParser 是微软专为 RFC 4180 设计的解析器,能自动识别:
– 引号包裹字段内的逗号和换行
– 连续两个双引号 "" 转义为单个 "
– 混合换行符 \r\n、\n、\r
- 必须添加引用:
Microsoft.VisualBasic(.NET Core/.NET 5+ 需装 NuGet 包Microsoft.VisualBasic.Core) - 不能用
File.ReadAllLines()预加载再喂给它——这会提前拆散多行字段,破坏逻辑 - 要用
new StreamReader("data.csv", Encoding.UTF8)显式传编码,BOM 或 GBK 文件不指定就乱码 -
parser.Delimiters = new[] { "," },别加空格,否则字段头尾多出空白
CsvHelper 适合结构固定、要强类型映射的场景
如果你的 CSV 总是“学号,姓名,语文,数学,英语”,且想直接转成 Student 类实例,CsvHelper 比 TextFieldParser 更省事,也更健壮。
- 必须先调
csv.Read(),再调csv.GetRecord<Student>(),顺序反了首行数据就丢了 - 表头不在第一行?设
csv.Configuration.HasHeaderRecord = false,然后手动csv.ReadHeader() - 中文日期如“2026/04/18”解析失败?配
csv.Configuration.TypeConverterOptionsCache.AddOptions<DateTime>(new TypeConverterOptions { CultureInfo = new CultureInfo("zh-CN") }) - 大文件别写
csv.GetRecords<Student>().ToList()——内存爆掉,改用foreach (var s in csv.GetRecords<Student>())流式处理
StreamReader + 手动解析只在极简场景下可行
如果你的 CSV 确实“绝对干净”:无引号、无换行、无空字段、编码统一,那 StreamReader 逐行 Split(',') 最轻量,没依赖、启动快。
但一旦出现 "李四,男,25" 这种字段,或 Excel 导出带 BOM 的 UTF-8 文件,立刻出错。
- 空行必须手动跳过:
if (string.IsNullOrWhiteSpace(line)) continue; - 字段前后空白得自己
Trim(),Split不处理 - 别信“用正则能搞定”——RFC 4180 规则太细,正则维护成本远高于引入
CsvHelper - 路径含中文或空格?Windows 下可能触发
UnauthorizedAccessException,优先用短路径或确保权限
Split。哪怕只多一行引号包裹的地址字段,TextFieldParser 和 CsvHelper 就立刻变成刚需。


















