使用CsvHelper加载含特殊引号的无效CSV文件问题求助
解决CsvHelper解析含内部单/双引号的单引号包裹CSV问题
核心配置调整
你的问题根源在于未设置引号转义规则:当单引号作为字段包裹符时,字符串内部的单引号会被CsvHelper误判为字段结束标记,引发解析异常;而双引号并非你指定的包裹符,默认不会触发异常,核心问题集中在单引号的处理上。
只需在CsvConfiguration中添加QuoteEscape配置,将转义符设为单引号(与包裹符一致),CsvHelper就会把连续的两个单引号解析为一个普通单引号:
CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ",", HasHeaderRecord = true, Quote = '\'', QuoteEscape = '\'' // 关键配置:用单引号转义内部单引号 };
针对非标准CSV的特殊处理
如果你的CSV文件里,字段内部的单引号是单个出现(而非标准的双单引号转义格式,比如示例中的your's),上述配置无法直接解析,这时可以通过自定义读取器预处理文本,把字段内的单个单引号替换为双单引号:
// 自定义预处理读取器 public class PreprocessReader : StreamReader { public PreprocessReader(string path) : base(path) { } public override string ReadLine() { var line = base.ReadLine(); if (string.IsNullOrEmpty(line)) return line; bool inQuotedField = false; char[] chars = line.ToCharArray(); for (int i = 0; i < chars.Length; i++) { if (chars[i] == '\'') { if (inQuotedField) { // 判断是否是字段结束的单引号(后接分隔符或行尾) if (i == chars.Length - 1 || chars[i+1] == ',') { inQuotedField = false; } else { // 内部单引号,插入转义用的单引号 Array.Resize(ref chars, chars.Length + 1); Array.Copy(chars, i, chars, i+1, chars.Length - i -1); chars[i] = '\''; i++; // 跳过插入的转义符 } } else { inQuotedField = true; } } } return new string(chars); } } // 使用方式 using var reader = new PreprocessReader("你的CSV文件路径"); using var csv = new CsvReader(reader, csvConfig); // 后续读取逻辑
效果验证
对于你给出的示例字符串:'this is your's 25" string',经过上述处理后,CsvHelper会正确解析为:this is your's 25" string(双引号会被完整保留,因为它不是指定的字段包裹符)。
内容的提问来源于stack exchange,提问作者Mladen
相关产品推荐
相关产品推荐

