使用CsvHelper解析文件,该文件具有不在类中的额外字段/属性

问题描述 投票:1回答:1

我需要解析主要映射到特定类的传入CSV文件。但是,如果客户愿意,可以允许客户在记录末尾添加额外的“用户定义”字段。所以CSV可能看起来像:

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

我的类已经为Id,FirstName和LastName命名了属性,但是没有为MyExtraField1和MyExtraField2命名。

如果我在名为“ExtraFields”的类上创建了一个新属性,这是一个Dict,是否可以在CSV中使用与该类不匹配的任何字段并将其填入ExtraFields字典?键将是标题中字段的名称,然后是该记录的值。或者是否有其他方法来捕获这些不映射到类中任何属性的字段?

c# csvhelper
1个回答
1
投票

我相信这会得到你想要的东西。

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)));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.