使用 CsvHelper 解析具有额外 Fields/Properties 不在 Class 中的文件

Parsing file with CsvHelper that has Extra Fields/Properties Not in the Class

我需要解析大部分映射到特定 class 的传入 CSV 文件。但是,如果客户愿意,可以在记录末尾添加额外的 "user defined" 字段。所以 CSV 可能看起来像:

Id,FirstName,LastName,MyExtraField1,MyExtraField2
1,John,Doe,foo,bar
2,Jane,Smith,foo2,bar2

我的 class 已为 Id、FirstName 和 LastName 命名属性,但没有为 MyExtraField1 和 MyExtraField2 命名。

如果我在 class 上创建了一个名为 "ExtraFields" 的新 属性,它是一个字典,是否可以采用 CSV 中与 [= 不匹配的任何字段21=] 并将其填充到 ExtraFields 字典中?键将是 header 中字段的名称,然后是该记录的值。或者是否有其他方法可以捕获这些未映射到 class 中任何 属性 的字段?

我相信这能满足您的需求。

static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader))
    {
        writer.WriteLine("Id,FirstName,LastName,MyExtraField1,MyExtraField2");
        writer.WriteLine("1,John,Doe,foo,bar");
        writer.WriteLine("2,Jane,Smith,foo2,bar2");
        writer.Flush();
        stream.Position = 0;

        csv.Read();
        csv.ReadHeader();
        var headers = csv.Context.HeaderRecord.ToList();

        csv.Configuration.RegisterClassMap(new TestClassMap(headers.Skip(3)));

        var records = csv.GetRecords<TestClass>().ToList();
    }
}

public class TestClass
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Dictionary<string, string> ExtraFields { get; set; }
}

public sealed class TestClassMap : ClassMap<TestClass>
{
    public TestClassMap(IEnumerable<string> headers)
    {
        Map(m => m.Id);
        Map(m => m.FirstName);
        Map(m => m.LastName);
        Map(m => m.ExtraFields).ConvertUsing(row => headers.ToDictionary(h => h, h => row.GetField(h)));
    }
}