C#使用CsvHelper读取CSV报Header with name [0] not found错误如何解决
问题根源
从调试输出可以看到,表头行被完整识别为1个列(HeaderRecord仅包含1个元素),原因是CsvHelper默认使用逗号作为分隔符,而你的CSV文件实际使用制表符(Tab,\t)作为列分隔符。之前添加Name、Index特性无效的原因是列未被正确拆分,不存在对应名称/索引的列。
解决方案
修改CsvReader的配置,手动指定分隔符为制表符即可,修改后的代码如下:
using CsvHelper.Configuration; using System.Globalization; public static void Main(string[] args) { // 初始化配置,指定分隔符为制表符 var config = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "\t", // 处理表头可能存在的前后空格 PrepareHeaderForMatch = args => args.Header.Trim() }; using (var streamReader = new StreamReader(@"C:\Users\Adam\Desktop\C#\price_detail.csv")) { using (var csvReader = new CsvReader(streamReader, config)) { // GetRecords返回延迟加载的迭代器,需要调用ToList/遍历才会实际执行读取 var records = csvReader.GetRecords<SKU>().ToList(); } } } public class SKU { public string PriceValueId { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } public string CatalogEntryCode { get; set; } public string MarketId { get; set; } public string CurrencyCode { get; set; } public DateTime ValidFrom { get; set; } public DateTime ValidUntil { get; set; } public decimal UnitPrice { get; set; } }
特殊情况处理
如果修改为制表符后仍然无法正常拆分列,说明文件是用多个空格作为分隔符,可替换为以下配置:
var config = new CsvConfiguration(CultureInfo.InvariantCulture) { // 正则匹配多个空格作为分隔符 Delimiter = @"\s+", Mode = CsvMode.RFC4180, PrepareHeaderForMatch = args => args.Header.Trim() };
内容的提问来源于stack exchange,提问作者Adam Lundberg
相关产品推荐
相关产品推荐

