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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:07:35