如何在C#中为CSV添加新列?解决表头未找到错误
解决C#中使用CsvHelper添加CSV不存在新列时的表头未找到错误
问题描述
开发了一个C#程序用于处理CSV文件,包含读取数据、修改内容、拆分行项以及添加额外数据列的功能,但运行时出现表头未找到的错误,错误信息如下:
Error: Header with name 'Payee_Country'[0] was not found. Header with name 'Payer_Address1'[0] was not found. Header with name 'Payer_Address2'[0] was not found. Header with name 'Payer_City'[0] was not found. Header with name 'Payer_State' [0] was not found. Header with name 'Payer_Zip'[0] was not found. Header with name 'Payer_Country'[0] was not found.
报错的列在输入CSV文件中不存在,尝试映射后引发更多错误,现有代码见下文。
错误原因
使用CsvHelper读取CSV时,默认会将实体类的所有属性与CSV文件的表头进行严格匹配。当实体类中定义了CSV文件里没有的字段时,CsvHelper会抛出找不到对应表头的异常。
解决方案
有两种可行的解决方式,任选其一即可:
方式1:为新增字段添加[Optional]特性
给实体类中CSV不存在的属性添加[Optional]特性,告知CsvHelper这些字段是可选的,读取时如果不存在不会报错。需要先引用CsvHelper.Configuration.Attributes命名空间。
方式2:配置CsvReader忽略缺失字段
在初始化CsvReader时,修改CsvConfiguration的MissingFieldFound属性为null,这样读取过程中遇到缺失的字段会直接忽略,不会抛出异常。
修改后的代码示例
方式1:使用[Optional]特性修改实体类
using CsvHelper.Configuration.Attributes; public class CsvRecord { public string GLAccountName { get; set; } public string BankRoutingNumber { get; set; } public string BankAccountNumber { get; set; } public DateOnly FileDate { get; set; } public string Amount { get; set; } public string InvoiceNumbers { get; set; } public string InvoiceDates { get; set; } public string InvoiceAmounts { get; set; } public string InvoiceTotals { get; set; } public string InvoiceDescriptions { get; set; } public string CheckNumber { get; set; } public string VendorID { get; set; } public string VendorName { get; set; } public string VendorAddressLine1 { get; set; } public string VendorAddressLine2 { get; set; } public string VendorCity { get; set; } public string VendorState { get; set; } public string VendorZip { get; set; } [Optional] public string Payee_Country { get; set; } public string VendorEmail { get; set; } [Optional] public string Payer_Address1 { get; set; } [Optional] public string Payer_Address2 { get; set; } [Optional] public string Payer_City { get; set; } [Optional] public string Payer_State { get; set; } [Optional] public string Payer_Zip { get; set; } [Optional] public string Payer_Country { get; set; } }
读取CSV的代码保持不变即可,因为特性已经告知CsvHelper忽略这些缺失的字段。
方式2:修改CsvReader配置
在读取CSV的代码块中,调整CsvConfiguration的设置:
// Read the CSV file List<CsvRecord> records; using (var reader = new StreamReader(FilePathTextBox.Text)) using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { // 设置忽略缺失字段 MissingFieldFound = null })) { records = csv.GetRecords<CsvRecord>().ToList(); }
这种方式不需要修改实体类,直接通过配置实现忽略缺失字段。
额外说明
两种方式都能解决问题,若需要明确标记哪些是新增的可选字段,推荐使用方式1;若希望统一忽略所有缺失字段,推荐使用方式2。修改后程序即可正常读取CSV,并在输出时包含新增的列数据。
内容的提问来源于stack exchange,提问作者Titanium_Alfa
相关产品推荐
相关产品推荐

