使用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
相关产品推荐
相关产品推荐

