Десериализация CSV с неизвестными заголовками в список или массив - PullRequest
0 голосов
/ 14 декабря 2018

Мой вопрос отличается от других вопросов SO, потому что эти примеры десериализации предназначены для typed<Customer> POCO class, в моем сценарии у меня нет никаких типов раньше времени.Файлы отбрасываются в папку из разных источников.

Без информации о типе или заголовке, как мне десериализовать / прочитать CSV-файл с неизвестными заголовками в List <>, JSON Array или Enumerable (я нене нужно данных)

using System;
using System.Data;
using System.Collections;
using System.Linq;
using ChoETL;
using System.Text;

public class Program
{
    public static void Main()
    {
        //headers are not known in the SourceFile.csv - i need a list and headers
        //var csvLisFromCho = new ChoCSVReader(@"SourceFile.csv").WithFirstLineHeader();

        StringBuilder csvIn = new StringBuilder(@"ID,Name
        1, David
        2, Bob");
        using (var r = new ChoCSVReader(csvIn).WithFirstLineHeader())
        {
            var list = r.Select(r1 => r1.Values).ToList();
            Console.WriteLine("Coverted List from Raj");
            list.ForEach(Console.WriteLine);
        }

    }
}

1 Ответ

0 голосов
/ 14 декабря 2018

Итак, чтобы получить список из CSV

StringBuilder csvIn = new StringBuilder(@"ID,Name
1, David
2, Bob");

using (var r = new ChoCSVReader(csvIn)
    .WithFirstLineHeader()
    )
{
    var list = r.Select(r1 => r1.Values).ToList();
}

ОБНОВЛЕНИЕ:

Чтобы получить заголовки, приведите запись к IDictionary и используйте свойство Keys дляэто, чтобы получить ключи.

Для автоматического обнаружения типов данных столбцов CSV необходимо установить MaxScanRows в анализаторе.В противном случае все столбцы будут обрабатываться как строковый тип.

StringBuilder csvIn = new StringBuilder(@"ID,Name,Date
1, David, 1/1/2018
2, Bob, 2/12/2019");

using (var r = new ChoCSVReader(csvIn)
    .WithFirstLineHeader()
    .WithMaxScanRows(2)
    )
{
    foreach (IDictionary<string, object> rec in r.Take(1))
    {
        foreach (var kvp in rec)
            Console.WriteLine($"{kvp.Key} - {r.Configuration[kvp.Key].FieldType}");
    }
}
...