C#读取含特殊字符CSV文件时CsvHelper、LumenWorksCsvReader报错求助
C#读取含特殊字符CSV文件的解决方案
解析报错核心原因是转义规则不匹配:RFC4180标准规定CSV中字段内的双引号需要用连续两个双引号转义,但你提供的CSV样例中使用了反斜杠
\转义双引号(14\"),两款库默认遵循标准转义规则,因此识别出错。
方案1:调整LumenWorksCsvReader配置适配转义规则
直接在初始化时指定转义字符为反斜杠即可,修改后代码如下:
// 先引入命名空间:using LumenWorks.Framework.IO.Csv; using System.IO; using System.Text; using (CsvReader csv = new CsvReader(new StreamReader(path, Encoding.UTF8), true)) { // 新增配置:指定转义字符为反斜杠 csv.Escape = '\\'; int fieldCount = csv.FieldCount; string[] headers = csv.GetFieldHeaders(); while (csv.ReadNextRecord()) { for (int i = 0; i < fieldCount; i++) Console.Write(string.Format("{0} = {1};", headers[i], csv[i])); Console.WriteLine(); } }
方案2:调整CsvHelper配置适配转义规则
如果使用CsvHelper,同样修改配置项即可适配反斜杠转义规则,示例代码如下:
// 先引入命名空间:using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.Text; var config = new CsvConfiguration(CultureInfo.InvariantCulture) { // 指定转义字符为反斜杠 Escape = '\\', AllowComments = false, TrimOptions = TrimOptions.None }; using (var reader = new StreamReader(path, Encoding.UTF8)) using (var csv = new CsvReader(reader, config)) { // 读取所有记录 var records = csv.GetRecords<dynamic>().ToList(); foreach (var record in records) { Console.WriteLine($"InvoiceDate = {record.InvoiceDate}; Device = {record.Device};"); } }
额外注意事项
- 代码中的
Encoding.UTF8请替换为你CSV文件实际使用的编码,中文系统生成的CSV通常是GB2312/GBK编码,可改为Encoding.GetEncoding("GBK") - 如果可以调整CSV生成规则,建议改为符合RFC4180标准的连续双引号转义(即把
14\"改为14""),兼容性更强
内容的提问来源于stack exchange,提问作者Manish Jain
相关产品推荐
相关产品推荐

