Использование FileHelpers для чтения динамического CSV в DataTable - PullRequest
0 голосов
/ 29 мая 2019

Мне кажется, 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 и т. д.)?

...