使用CSVHelper时CsvReader.GetRecords未读取到CSV中的记录
CSVHelper 30.0.1读取无表头单行CSV时GetRecords无返回的问题解决
问题描述
使用CSVHelper 30.0.1加载无表头且仅含一行数据的CSV文件时,调用CsvReader.GetRecords<T>后未获取到任何记录,即便CSV中存在有效数据。已尝试通过[Index]特性映射字段、[HasHeaderRecord(false)]特性配置类,以及将CsvConfiguration.HeaderValidated设为null,但问题仍未解决。
CSV内容:
Fred,Borscht
现有简化代码:
[HasHeaderRecord(false)] public class MyBizObject { [Index(0)] public string FirstName { get; set; } [Index(1)] public string LastName { get; set; } } CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture); csvConfig.HeaderValidated = null; using (TextReader textReader = new StreamReader(filePath)) using (CsvReader csvReader = new CsvReader(textReader, csvConfig)) { IEnumerable<MyBizObject> records = rdr.GetRecords<MyBizObject>().ToList(); }
问题原因
- 配置冲突:类上标记的
[HasHeaderRecord(false)]被全局配置覆盖。CSVHelper默认HasHeaderRecord为true,若未在CsvConfiguration中显式设置为false,会将唯一的一行数据当作表头处理,而非数据行,导致GetRecords无返回。 - 代码笔误:
rdr.GetRecords<MyBizObject>()中的变量名错误,实际应使用csvReader,否则会引发编译或运行时异常。
修正后的代码
public class MyBizObject { [Index(0)] public string FirstName { get; set; } [Index(1)] public string LastName { get; set; } } // 全局配置中明确禁用表头记录 CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = false, HeaderValidated = null }; using (TextReader textReader = new StreamReader(filePath)) using (CsvReader csvReader = new CsvReader(textReader, csvConfig)) { // 修正变量名,正确调用GetRecords IEnumerable<MyBizObject> records = csvReader.GetRecords<MyBizObject>().ToList(); }
补充说明
- 当
HasHeaderRecord设为false时,CSVHelper会直接从第一行开始读取数据,配合[Index]特性可精准映射字段位置。 - 移除类上的
[HasHeaderRecord(false)]特性,统一通过CsvConfiguration管理配置,避免配置歧义。
内容的提问来源于stack exchange,提问作者Krisroe
相关产品推荐
相关产品推荐

