Мне кажется, FileHelpers очень удобен для обработки "богатых" CSV с пользовательскими разделителями, заключенными в кавычки идентификаторами, фильтрацией пустых элементов и т. Д. Но в основном он предназначен для загрузки файлов с заранее известным форматом для создания строго типизированного списка объектов.со свойствами, украшенными атрибутами, которые, как предполагается, соответствуют заголовкам.
Моя цель немного отличается: я хотел бы иметь возможность загружать пользовательские файлы CSV с заранее неизвестным форматом и количеством столбцов, вгибкий формат, такой как DataTable, или какой-то строковый массив.Дополнительное замечание: мой CSV исходят из Stream, а не из физических файлов.
Я предпринял несколько попыток, используя такие методы, как ReadStreamAsDT
в FileHelperEngine
(полная реализация ниже), но я столкнулся с некоторыми проблемами.
- Если заголовки содержат пробелы или другие символы, которые не могут отображаться в свойствах C #, выдается исключение "
The string 'My field' not is a valid .NET identifier
".Мои заголовки могут содержать все типы символов. - Требуется вручную разобрать строку заголовка отдельно
Моя реализация, которая имеет проблемы выше:
using (var streamReader = new StreamReader(stream, true))
{
var cb = new DelimitedClassBuilder("temp", ";")
{
IgnoreFirstLines = 0,
IgnoreEmptyLines = true,
Delimiter = ";"
};
var headerArray = streamReader.ReadLine().Split(';');
foreach (var header in headerArray)
{
cb.AddField(header, typeof(string));
cb.LastField.FieldQuoted = true;
cb.LastField.QuoteChar = '"';
}
var engineType = cb.CreateRecordClass();
var engine = new FileHelperEngine(engineType);
var datatable = engine.ReadStreamAsDT(streamReader);
}
IЯ хотел бы избежать импорта другого пакета CSV, кроме FileHelpers, и, поскольку нам также необходимо генерировать некоторые CSV позже, используя ту же логику, я хотел бы избежать написания собственного кода для этого.
Документация FileHelpers неМне очень помогло использование DataTable.
Я также заметил однострочные методы, такие как CommonEngine.CsvToDataTable()
или CsvEngine.CsvToDataTable()
, но он предназначен для работы с физическими файлами.
Есть ли способчтобы сделать это с помощью FileHelpers, чтобы воспользоваться некоторыми из расширенных функций (безопасная обработка кавычек, обрезка, генерация CSV и т. д.)?