Десериализация CSV с неизвестными заголовками в список или массив
Мой вопрос отличается от других вопросов 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 ответ
Решение
Вот, пожалуйста, чтобы получить список от 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}");
}
}