Как сопоставить заголовок 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());
}
}