如何通过CsvReader根据指定列索引获取列标题?
问题场景
使用CsvHelper读取CSV时,常规方式可直接通过实体类属性访问字段值,但当需要通过列索引(如record.GetField(columnIndex))获取字段值时,需要拿到该索引对应的CSV列标题,以此来创建XmlElement。
基础示例(来自官方文档)
CSV内容
Id,Name 1,one 2,two
实体类定义
public class Foo { [Index(0)] public int Id { get; set; } [Index(1)] public string Name { get; set; } }
基础读取代码
using (var reader = new StreamReader("path\\to\\file.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords<Foo>(); foreach (var record in records) { // 直接通过属性访问字段 // record.Id // record.Name } }
解决方案
要通过列索引获取对应列标题,可借助CsvReader的Context.HeaderRecord属性——它存储了解析后的CSV表头数组,直接通过索引即可获取对应标题:
修改后的读取代码
using (var reader = new StreamReader("path\\to\\file.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { // 先读取表头,确保HeaderRecord完成初始化 csv.Read(); csv.ReadHeader(); var records = csv.GetRecords<Foo>(); foreach (var record in records) { // 遍历所有列索引 for (int columnIndex = 0; columnIndex < csv.Context.HeaderRecord.Length; columnIndex++) { // 通过索引获取字段值 var fieldValue = record.GetField(columnIndex); // 通过索引获取对应列标题 var columnHeader = csv.Context.HeaderRecord[columnIndex]; // 此处添加用columnHeader创建XmlElement的逻辑 // 示例: // XmlElement element = doc.CreateElement(columnHeader); // element.InnerText = fieldValue; } } }
关键说明
csv.Context.HeaderRecord是字符串数组,与CSV列的索引一一对应,直接存储各列的表头文本。- 必须先调用
csv.Read()和csv.ReadHeader(),确保表头被正确解析,否则HeaderRecord会为null。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

