You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在CsvHelper 19及更早版本中获取CSV表头列名?

如何在CsvHelper 19及更早版本中获取CSV表头列名?

我太懂你这种降级版本踩API坑的感受了——之前用v33顺手能用的HeaderRecord突然找不到,试了几个方法都碰壁,确实闹心。别慌,早期版本的CsvHelper只是表头获取的逻辑不一样,我给你捋两个靠谱的解决办法:

方法一:用Context.HeaderRecord(适配v19左右版本)

其实你之前试的csvReader.Context.HeaderRecord是可行的,大概率是调用顺序没对。在v19版本里,必须严格按以下步骤来:

  1. 确保配置里HasHeaderRecord设为true(你的原代码已经做好这步了)
  2. 先调用csvReader.Read()读取表头行
  3. 再调用csvReader.ReadHeader()完成表头解析
  4. 最后通过csvReader.Context.HeaderRecord拿到完整的表头数组

调整后的代码是这样的:

using (var csvReader = new CsvReader(streamReader, new CsvConfiguration(CultureInfo.InvariantCulture) { 
    HasHeaderRecord = hasHeader, 
    Delimiter = Delimeter, 
    Quote = QuoteChar, 
    Comment = CommentChar 
})) {
    if (hasHeader) {
        csvReader.Read();
        csvReader.ReadHeader();
        // 替换成Context.HeaderRecord即可
        foreach (var headerCol in csvReader.Context.HeaderRecord) {
            dataTable.Columns.Add(headerCol);
        }
    }
}

方法二:逐字段读取表头(适配更旧的版本,比如v15及更早)

如果你的版本比v19还要老,连Context.HeaderRecord都找不到,那就换个更基础的思路:在调用Read()读取表头行之后,直接通过索引逐个取字段值,这些值就是表头列名。要是之后还要读取数据行,记得补调用ReadHeader(),让CsvReader建立表头和列的映射,方便后续按列名读数据。

代码示例:

using (var csvReader = new CsvReader(streamReader, new CsvConfiguration(CultureInfo.InvariantCulture) { 
    HasHeaderRecord = hasHeader, 
    Delimiter = Delimeter, 
    Quote = QuoteChar, 
    Comment = CommentChar 
})) {
    if (hasHeader) {
        // 先读取表头行
        if (csvReader.Read()) {
            // 遍历所有字段索引,逐个获取表头名称
            for (int i = 0; i < csvReader.FieldCount; i++) {
                var headerName = csvReader.GetField(i);
                dataTable.Columns.Add(headerName);
            }
            // 后续要按列名读数据的话,必须加这一步
            csvReader.ReadHeader();
        }
    }
}

这里要特别提醒下,早期CsvHelper的API对调用顺序要求很严,Read()ReadHeader()的顺序绝对不能搞反,不然肯定拿不到正确的表头数据。

内容来源于stack exchange

火山引擎 最新活动