CsvReader.ColumnCount始终返回0,与CsvReader.Parser.Count不符的原因
原因分析
csvReader.ColumnCount返回的是已映射到实体类的列数,而非当前行解析出的总列数;而csvReader.Parser.Count是CSV解析器从当前行实际解析得到的列数,二者语义完全不同:
- 第一次输出(表头行):此时还未执行任何实体映射操作(
GetRecord<Foo>()尚未调用),没有映射的列,所以ColumnCount为0;但解析器正确识别了表头的2列,因此Parser.Count为2。 - 第二次输出(数据行):虽然调用了
GetRecord<Foo>(),但30.x版本的CsvHelper中,ColumnCount不会自动同步自动映射后的列数,需要直接访问映射上下文才能获取正确数值。
另外你的代码存在读取顺序问题:正确的表头读取流程应该是先调用ReadHeader(),再进入数据行循环,而非先调用Read()再处理表头。
解决方案
修正读取顺序,并通过映射上下文获取已映射列数:
var sb = new StringBuilder(); sb.Append(@"Title,Something"); sb.AppendLine(); sb.Append(@"hello world,abc"); sb.AppendLine(); using var stringReader = new StringReader(sb.ToString()); using var csvReader = new CsvReader(stringReader, CultureInfo.InvariantCulture); // 先读取表头 csvReader.ReadHeader(); Debug.WriteLine($"header parser column count: {csvReader.Parser.Count}"); // 循环读取数据行 while (csvReader.Read()) { var foo = csvReader.GetRecord<Foo>(); // 获取已映射到实体的列数 var mappedColumnCount = csvReader.Context.Mapping.Columns.Count; Debug.WriteLine($"data mapped column count: {mappedColumnCount} and parser column count: {csvReader.Parser.Count}"); } class Foo { public string Title { get; set; } = null!; public string Something { get; set; } = null!; }
补充说明
CsvHelper文档中“该值应与IParser.Count匹配”的描述,仅适用于所有解析出的列都配置了对应实体属性映射的场景,此时映射列数才会和解析列数相等。如果存在未映射的列,二者数值会不一致。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

