CSVHelper, C#, Список - PullRequest
       17

CSVHelper, C#, Список

0 голосов
/ 08 апреля 2020

Я пытаюсь прочитать несколько типов записей из файла CSV, в котором первая строка содержит следующие записи

идентификатор, имя, количество значений

, а вторая строка имеет

дата, смещение, значения [0..n], качество

С помощью оригинального csvhelper пример я могу прочитать исходные строки, но не могу понять, как пройти BarMap количество значений, которые должны быть агрегированы помоги мне в этом.

1 Ответ

1 голос
/ 09 апреля 2020

Если вы хотите выполнить агрегацию, вы можете использовать ConvertUsing. https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/inline-type-conversion

Функция передает значение IReaderRow, и вам необходимо вернуть значение, которое установлено для свойства. Поскольку у вас есть строка, вы можете извлечь из любого поля все, что захотите, и создать значение, которое будет установлено.

Пример:

void Main()
{
    var s = new StringBuilder();
    s.AppendLine("Id,A,B");
    s.AppendLine("1,2,3");
    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 int Sum { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id);
        Map(m => m.Sum).ConvertUsing(row => row.GetField<int>("A") + row.GetField<int>("B"));
    }
}

Если вы хотите, чтобы все остальные поля были помещены в List или что-то подобное, вы можете сделать это.

void Main()
{
    var s = new StringBuilder();
    s.AppendLine("Id,A,B");
    s.AppendLine("1,2,3");
    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 List<int> TheRest { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id);
        Map(m => m.TheRest).Index(1);
    }
}

Вы также можете указать конечный индекс.

...