Как мне сопоставить CSV-заголовок с именем свойства во время выполнения с помощью choETL - PullRequest
0 голосов
/ 31 марта 2020

Используя 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?

1 Ответ

0 голосов
/ 31 марта 2020

ОБНОВЛЕНИЕ : так вы можете настроить конфигурацию в соответствии с вашими требованиями

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 отсутствует третье имя поля 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

Вот еще один способ полностью управлять синтаксическим анализом CSV с помощью просто с классом POCO

[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());
    }
}
...