You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:24:54