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

CsvHelper读取大CSV文件时保留引号且正确解析字段的问题

解决CsvHelper读取CSV时保留原始引号并正确解析字段的问题

我明白你的需求:要把大型CSV文件的每一行内容完全按原格式(带引号的字段保留引号,不带的原样)存入List<string>,但用CsvHelper的常规设置要么会错误拆分带逗号的引号字段,要么会自动去除引号。

核心解决方案:利用CsvHelper Parser的原始Token文本

CsvHelper的解析器其实保留了每个字段的原始文本(包括外层引号),只是默认返回的字段值会去掉引号。我们可以直接访问解析器的TokenList,获取每个Token的Raw属性,这样就能得到完全符合你要求的原始字段内容。

修改后的完整代码

using (StreamReader reader = new StreamReader(myStream))
{
    using (CsvReader csv = new CsvReader(reader))
    {
        csv.Configuration.BadDataFound = null;
        csv.Configuration.Delimiter = ",";
        // 关键:保持IgnoreQuotes=false(默认值),让解析器正确识别引号包裹的字段,避免拆分内部逗号
        // 不需要设置IgnoreQuotes=true,否则会破坏带逗号的引号字段解析
        
        while (csv.Read())
        {
            List<string> values = new List<string>();
            // 遍历解析器的TokenList,获取每个字段的原始文本(包含引号)
            foreach (var token in csv.Context.Parser.TokenList)
            {
                values.Add(token.Raw);
            }
            
            // 这里可以添加你的后续处理逻辑,比如验证输出
            Console.WriteLine(string.Join(" ", values));
        }
    }
}

效果验证

对于你提供的示例CSV行,生成的values列表元素会完全匹配你的期望:

  • 1141825007047(无引号)
  • 2019-02-18(无引号)
  • 02:55(无引号)
  • "US"(保留原始引号)
  • "ATL"(保留原始引号)
  • "UA236,UA208"(保留引号且内部逗号不被拆分)
  • ...其余字段均保持原始格式

为什么之前的设置不行?

  • 当IgnoreQuotes=true时,CsvHelper会把引号当作普通字符,导致带逗号的引号字段(比如"UA236,UA208")被错误拆分成两个字段。
  • 当IgnoreQuotes=false时,解析器能正确识别引号包裹的字段,但默认返回的字段值会自动去除外层引号,不符合你保留原始格式的需求。
  • 而Token.Raw属性直接存储了解析器从原始CSV行中提取的字段文本,完美保留了所有原始格式(包括引号)。

内容的提问来源于stack exchange,提问作者DevyDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:04