首页 > 解决方案 > 使用 CsvHelper 将不同的列标题名称映射到 C# 实体类中的单个字段

问题描述

我有几个不同的 csv 文件结构,每个结构在第 2 列上都有不同的列标题名称,并且需要将此列值映射到 c# 实体类上的字段,并且想知道如何使用 CsvHelper 来实现这一点。

例如:一个文件的列标题为“ColumnXYZ”,另一个文件的列标题为“ColumnABC”,使用 CsvHelper 必须首先检查文件中存在哪个列标题名称,然后将列值映射到“FieldQwe”的一个实体。两个列标题名称都不会存在于单个文件中。因此,寻找有关处理这种情况的任何想法。

我可以在实体字段上使用这样的东西,这样 AutoMap 就可以正常工作了吗?

[Name("ColumnABC", "ColumnXYZ")]
public string Field1{ get; 放; }

标签: csvhelper

解决方案


您可以在https://joshclose.github.io/CsvHelper/examples/configuration/class-maps找到一些配置示例

void Main()
{
    using (var reader = new StreamReader("path\\to\\file.csv"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Configuration.RegisterClassMap<FooMap>();
        var records = csv.GetRecords<Foo>();
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get set; }
}

public sealed class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id).Name("TheId", "Id");
        Map(m => m.Name).Name("TheName", "Name");
    }
}

推荐阅读