GenericParserAdapter解析eBay交易CSV文件字段错误拆分问题求解
问题根因
你遇到的字段拆分错误由两个核心原因导致:
- 你的CSV数值字段使用逗号作为小数分隔符(如
-1,29、4,43151),解析器默认将逗号识别为字段分隔符,未正确识别引号包裹的字段边界 - 该CSV采用标准CSV双引号转义规则:字段内的双引号用两个连续双引号
""表示,同时整行额外包裹了一层双引号,默认配置的解析器无法适配这种格式
方案1:正确配置GenericParserAdapter
直接调整解析器参数即可适配当前CSV格式,参考配置代码:
using GenericParsing; // 初始化解析器,支持传文件路径或文本流 using var parser = new GenericParserAdapter("目标文件路径.csv") { // 字段分隔符设为逗号 ColumnDelimiter = ',', // 字段包裹符号为双引号 QuoteCharacter = '"', // 核心配置:双引号的转义字符为双引号本身,适配""转义规则 QuoteEscapeCharacter = '"', // 若CSV首行是表头设为true,否则设为false FirstRowHasHeader = false, // 自动修剪字段前后的空白字符 TrimWhitespace = true }; // 添加行预处理逻辑,去掉整行外层包裹的多余双引号 parser.PreprocessLine += (sender, e) => { if (e.Line.StartsWith('"') && e.Line.EndsWith('"')) { e.Line = e.Line.Substring(1, e.Line.Length - 2); } }; // 读取解析结果 while (parser.Read()) { // itemArray即为正确拆分的字段数组 object[] itemArray = parser.GetValues(); }
方案2:正则拆分替代方案
如果调整解析器配置仍不生效,可以用正则表达式手动拆分,完全兼容当前格式:
using System.Text.RegularExpressions; // 原始CSV行内容 string rawLine = "\"31 lip 2021,\"\"Inna opłata\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"-1,29\"\",\"\"EUR\"\",\"\"2 sie 2021\"\",\"\"111\"\",\"\"mBank *7981\"\",\"\"Środki zostały wysłane\"\",\"\"--\"\",\"\"111\"\",\"\"--\"\",--,\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"0%\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"--\"\",\"\"-5,7\"\",\"\"PLN\"\",\"\"4,43151\"\",\"\"FEE-111\"\",\"\"Opłata za nazwę pomocniczą przedmiotu \"\"\""; // 先去掉整行外层的双引号 string processedLine = rawLine.Trim('"'); // 匹配CSV字段的正则,适配双引号转义和字段内逗号 Regex csvRegex = new Regex(@"(?<=^|,)(?:""([^""]*(?:""""[^""]*)*)""|([^,]*))"); MatchCollection matches = csvRegex.Matches(processedLine); List<string> fields = new List<string>(); foreach (Match match in matches) { // 提取字段值,将转义的双引号""替换为单个" string fieldValue = match.Groups[1].Success ? match.Groups[1].Value.Replace("\"\"", "\"") : match.Groups[2].Value; fields.Add(fieldValue); }
执行后fields列表即为正确拆分的字段,原本被误拆的-1,29、4,43151等字段会完整保留为单个元素。
内容的提问来源于stack exchange,提问作者RomiGrabarz
相关产品推荐
相关产品推荐

