You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:57:42