Как сопоставить заголовок CSV с именем свойства во время выполнения с помощью 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?

1 ответ

Решение

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

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());
    }
}
Другие вопросы по тегам