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

使用C# TextFieldParser解析含双引号字段的CSV遇阻求助

问题分析与解决

首先明确:你没有忽略TextFieldParser的关键设置——这个组件只遵循标准CSV规范,其中字段内的双引号必须用两个连续双引号("")来转义,而你提供的行里,字段内的引号是单个的(比如"this is container "A" in room"里的"A"),这属于非标准格式,TextFieldParser没有内置参数支持解析这种情况。

为什么解析失败?

TextFieldParser开启HasFieldsEnclosedInQuotes = true后,会把第一个"当作字段起始,遇到下一个"就认为字段结束,所以你的行被错误拆分:

  • 第一个字段:abc
  • 第二个字段:def
  • 第三个字段:this is container
  • 第四个字段:A
  • 后续内容会被当成更多错误字段,导致解析混乱。

可行解决方案(无需复杂正则)

如果无法修改源文件的格式,最直接的方式是预处理每一行,修正字段内的单引号为标准转义格式,再交给TextFieldParser解析。

示例代码如下:

var lines = File.ReadAllLines(Filename);
var processedLines = new List<string>();

foreach (var line in lines)
{
    bool inQuotes = false;
    var sb = new StringBuilder();
    
    foreach (var c in line)
    {
        if (c == '"')
        {
            if (inQuotes)
            {
                // 检查下一个字符是否也是引号(避免替换分隔用的引号)
                int currentIndex = sb.Length;
                if (currentIndex < line.Length - 1 && line[currentIndex + 1] != '"')
                {
                    // 在字段内的单个引号,替换为两个
                    sb.Append('"');
                }
            }
            inQuotes = !inQuotes;
        }
        sb.Append(c);
    }
    
    processedLines.Add(sb.ToString());
}

// 使用处理后的内容创建TextFieldParser
using var reader = new StringReader(string.Join(Environment.NewLine, processedLines));
using TextFieldParser parser = new(reader);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(RawFileDelimiter);
parser.HasFieldsEnclosedInQuotes = true;

while (!parser.EndOfData)
{
    string[] fields = parser.ReadFields();
    // 后续处理逻辑
}

这段代码的核心逻辑是:遍历每行的每个字符,跟踪是否处于引号包裹的字段内,当在字段内遇到单个双引号时,自动补充一个引号,将其转为标准CSV的转义格式("A" → "A""),确保TextFieldParser能正确识别字段边界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:24:32