Я нахожу FileHelpers очень удобными для обработки «богатых» CSV, с пользовательскими разделителями, идентификаторами в кавычках, фильтрацией пустых элементов и т. д. Но в основном это, по-видимому, предназначено для загрузки файлов с заранее известным форматом для создания строго типизированного списка объектов со свойствами, украшенными атрибутами, которые должны соответствовать заголовкам.
Моя цель немного другая: Я хотел бы иметь возможность загружать пользовательские файлы CSV с заранее неизвестным форматом и количеством столбцов, в гибком формате, таком как DataTable, или в каком-то массиве строк. Боковое замечание: мой csv поступает из потока, а не из физических файлов.
Я сделал несколько попыток, используя такие методы, как ReadStreamAsDT в FileHelperEngine (полная реализация ниже), но столкнулся с некоторыми проблемами.
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);
}
Я хотел бы избежать импорта другого пакета CSV, кроме FileHelpers, и, поскольку нам также нужно сгенерировать некоторый CSV позже, используя ту же логику, я бы не хотел писать для этого собственный код.
Документация FileHelpers не очень помогла мне с использованием DataTable.
Я также заметил однострочные методы, такие как CommonEngine.CsvToDataTable() или CsvEngine.CsvToDataTable(), но они предназначены для работы с физическими файлами.
Есть ли способ сделать это с помощью FileHelpers, чтобы воспользоваться некоторыми расширенными функциями (безопасная обработка цитат, обрезка, создание CSV и т. д.)?
@Dai, что делает требует дополнительного компонента, драйвера Jet, который должен соответствовать разрядности приложения. Он также не может обрабатывать странные CSV-файлы, например, с заголовками или недопустимыми строками. Я не уверен, что он может обрабатывать текстовые поля с символами новой строки, которые разрешены являются в CSV.
Спасибо @Dai, но использование OLE/Jet определенно не то, чем я хочу заниматься. Я хочу «управляемое» решение с настраиваемым поведением.





В то время, когда я писал вопрос, я только что написал свой собственный код для загрузки CSV-файла в таблицу данных со всеми необходимыми мне функциями.
Тем не менее, есть другая библиотека, чем FileHelpers, которая справляется с этой задачей намного лучше, "CsvHelper": https://joshclose.github.io/CsvHelper/: https://joshclose.github.io/CsvHelper/examples/data-table/
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Load(dr);
}
}
(просто установите свой разделитель, если вам нужно его настроить и т. д.)
Или вы можете сделать это вручную, если хотите: https://github.com/JoshClose/CsvHelper/issues/1142#issuecomment-432910368, если хотите.
Вам не нужно использовать какие-либо сторонние библиотеки для чтения файлов CSV в объект
DataTable— вы можете использовать OLE-DB для прямого чтения файла CSV: stackoverflow.com/questions/1050112/…