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

