如何使用 ChoETL 在运行时将 CSV header 映射到属性名称

How do I map CSV header to propertyname at runtime with ChoETL

使用 choETL 我发现我可以像这样将 csv 位置映射到 属性 名称

        public class Emp
        {
            public string Name { get; set; }
            public string Other{ get; set; }


            public string MyId { get; set; }
        }

        [Test]
        public void TestMapping()
        {
            ChoCSVRecordConfiguration config = new ChoCSVRecordConfiguration();
            config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("MyId", 1));
            config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Name", 2));
            config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Other", 3));
            config.WithFirstLineHeader(true);

            string csv = @"Id, Name, 
1, Tom, NY
2, Mark, NJ
3, Lou, FL
4, Smith, PA
5, Raj, DC
";

            using (var p = ChoCSVReader<Emp>.LoadText(csv, Encoding.ASCII,config)
//                .WithFirstLineHeader(true)
            )
            {
                Console.WriteLine(p.ToList().DumpAsJson());
            }

        }

然而我真正想要的是能够在运行时映射。使用以下伪代码:

    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("MyId", "Id"));
    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Name", "Name"));
    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Other", "City"));


    string csv1 = @"Id, Name, City
1, Tom, NY
2, Mark, NJ
3, Lou, FL
4, Smith, PA
5, Raj, DC
";

    string csv2 = @"Name, Id, City
Tom, 1, NY
Mark, 2, NJ
Lou, 3, FL
Smith, 4, PA
Raj, 5, DC
";

所以我可以对两个 csv 文件使用相同的配置。除了位置被调换之外,它们几乎完全相同。 这可以用 choETL 实现吗?

更新:这是设置配置以满足您的要求的方法

ChoCSVRecordConfiguration config = new ChoCSVRecordConfiguration();
config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("MyId", 0) { FieldName = "Id" });
config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Name", 0) { FieldName = "Name" });
config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Other", 0) { FieldName = "City" });
config.WithFirstLineHeader(false);

希望这对您有所帮助。


是的,这是可能的,而且您正确地启动了您的代码。查看您的示例代码后,注意到您输入的 CSV 缺少第 3 个字段名称 City。这可能会导致解析器失败。

这是工作示例。

public class Emp
{
    public string Name { get; set; }
    public string Other { get; set; }


    public string MyId { get; set; }
}

public static void TestMapping()
{
    ChoCSVRecordConfiguration config = new ChoCSVRecordConfiguration();
    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("MyId", 1));
    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Name", 2));
    config.CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration("Other", 3));
    config.WithFirstLineHeader(true);

    string csv = @"Id, Name, City
1, Tom, NY
2, Mark, NJ
3, Lou, FL
4, Smith, PA
5, Raj, DC
";

    using (var p = ChoCSVReader<Emp>.LoadText(csv, Encoding.ASCII, config))
    {
        Console.WriteLine(p.ToList().Dump());
    }
}

输出:

[Count: 5]
-- CoinCount.Program+Emp State --
        Name: Tom
        Other: NY
        MyId: 1


-- CoinCount.Program+Emp State --
        Name: Mark
        Other: NJ
        MyId: 2


-- CoinCount.Program+Emp State --
        Name: Lou
        Other: FL
        MyId: 3


-- CoinCount.Program+Emp State --
        Name: Smith
        Other: PA
        MyId: 4


-- CoinCount.Program+Emp State --
        Name: Raj
        Other: DC
        MyId: 5

这是另一种方法,仅使用 POCO class

即可完全管理 CSV 解析
[ChoCSVFileHeader(IgnoreHeader = true)]
public class Emp
{
    [ChoCSVRecordField(2)]
    public string Name { get; set; }
    [ChoCSVRecordField(3)]
    public string Other { get; set; }
    [ChoCSVRecordField(1)]
    public string MyId { get; set; }
}

public static void TestMapping()
{
    string csv = @"Id, Name, City
1, Tom, NY
2, Mark, NJ
3, Lou, FL
4, Smith, PA
5, Raj, DC
";

    using (var p = ChoCSVReader<Emp>.LoadText(csv))
    {
        Console.WriteLine(p.ToList().Dump());
    }
}