CsvHelper определяет пользовательское сопоставление для столбца - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь, чтобы в CSV-файле не было столбца, заполненного с помощью CSVHelper. Это пример CSV, который мне нужно импортировать

Id
10
123
45
213

Класс, в который я пытаюсь десериализоваться, следующий:

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

При конфигурации по умолчанию я получаю эту ошибку:

CsvHelper.HeaderValidationException: «Заголовок с именем« Имя »не найден.

Я хотел бы иметь возможность определить отображение так, чтобы столбец Name мог быть заполнен синтаксическим анализатором (например, путем предоставления словаря значений). Любой способ сделать это?

Спасибо

---------- РЕДАКТИРОВАТЬ

Просто чтобы уточнить, идея состоит в том, чтобы иметь что-то вроде конвертера, который , связанный с полем, будет использоваться для декодирования идентификатора в Name

public class NameConverter
{
    public NameConverter()
    {
        employeesList = new Dictionary<int, string>()
        {
            { 10, "Mary" },
            { 45, "Mike" },
            { 123, "Jack" },
            { 213, "Suzanne" },
        };
    }

    IDictionary<int, string> employeesList;

    public string GetValue(int id) => employeesList[id];
}

Альтернативой, как я могу себе представить, является игнорирование поля Name, как предложено, и внедрение NameConverter в класс Foo и создание Наименование получить только свойство.

1 Ответ

2 голосов
/ 05 апреля 2020
void Main()
{
    var s = new StringBuilder();
    s.AppendLine("Id");
    s.AppendLine("45");
    s.AppendLine("123");
    using (var reader = new StringReader(s.ToString()))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Configuration.RegisterClassMap<FooMap>();
        csv.GetRecords<Foo>().ToList().Dump();
    }
}

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

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        var nameConverter = new NameConverter();
        Map(m => m.Id);
        Map(m => m.Name).ConvertUsing(row => nameConverter.GetValue(row.GetField<int>(nameof(Foo.Id))));
    }
}

public class NameConverter
{
    public NameConverter()
    {
        employeesList = new Dictionary<int, string>()
        {
            { 10, "Mary" },
            { 45, "Mike" },
            { 123, "Jack" },
            { 213, "Suzanne" },
        };
    }

    IDictionary<int, string> employeesList;

    public string GetValue(int id) => employeesList[id];
}

Выход:

enter image description here

...