Я использую библиотеку CSVHelper, который может извлечь список объектов из CSV файла с помощью всего три строки кода:Как передать коллекцию строк как TextReader?
var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader(streamReader);
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();
Однако, файл имеет бессмысленные строки, и мне нужно, чтобы пропустить первые десять строк в файле. Я думал, что неплохо было бы использовать LINQ для обеспечения «чистых» данных, а затем передать эти данные в CsvFReader
, например, так:
public TextReader GetTextReader(IEnumerable<string> lines)
{
// Some magic here. Don't want to return null;
return TextReader.Null;
}
public IEnumerable<T> ExtractObjectList<T>(string filePath) where T : class
{
var csvLines = File.ReadLines(filePath)
.Skip(10)
.Where(l => !l.StartsWith(",,,"));
var textReader = GetTextReader(csvLines);
var csvReader = new CsvReader(textReader);
csvReader.Configuration.ClassMapping<EventMap, Event>();
return csvReader.GetRecords<T>();
}
Но я действительно застрял в толкая «статический» набор строк через поток как TextReaer
.
Моей альтернативой является обработка файла CSV по строкам через CsvReader и проверка каждой строки перед извлечением объекта, но я нахожу это несколько неуклюжим.
Я бы, вероятно, пошел со вторым вариантом, тогда вам не нужно хранить весь файл в памяти (например, вы сейчас делаете) – Magnus
Да, подумав об этом, я согласен. Файл предназначен для парковки, тех, кто использует безналичную систему, входы и существует со всей страны и, безусловно, будет довольно большой. Хотя это Невидимый вариант. Второй вариант выше по-прежнему делает все сразу процесс правильной записи. – ProfK