Создание строго типизированного DataTable из файла CSV в байте [] - PullRequest
2 голосов
/ 03 декабря 2009

Я занимаюсь разработкой с использованием C # 3 и .NET 3.5, и у меня есть объект, в котором содержимое файла CSV (неизвестного формата) содержится в свойстве byte []. Мне нужно проанализировать этот байт [] и создать таблицу System.DataTable, содержащую столбцы и строки.

Проблема заключается в создании таблицы System.DataTable, в которой типы данных столбцов соответствуют данным в CSV.

В настоящее время я использую CsvReader для анализа байта [] CSV, поскольку это хорошо работает с потоками и очень быстро. К сожалению, это просто обрабатывает все данные как строки.

Я пытался использовать Jet / OLEDB для чтения из файла CSV, и это успешно создает DataTable со столбцами разных типов данных - однако, поскольку это требует использования строки подключения, я предполагаю, что ее нельзя использовать для анализа байт [] в памяти.

Есть ли способ, которым это можно сделать, и если нет, то каким будет разумный способ вывести типы данных и преобразовать нетипизированный DataTable в DataTable с конкретными типами данных столбцов?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Я думаю, что если Jet / OLEDB может сделать это для файла, вы можете создать файл с отображением в памяти и передать его в Jet. Однако я бы предпочел сделать это сам, выполнив три простых шага

1) прочитать первые N строк с помощью CsvReader и определить типы данных (если все N выглядят как целые числа, поле является целым числом и т. Д.)

2) создать DataTable с соответствующей структурой

3) возобновить чтение и заполнить его.

0 голосов
/ 03 декабря 2009

Вы всегда можете взглянуть на библиотеку FileHelpers: CsvToDataTable или ReadStreamAsDT , для которой вам сначала нужно получить массив байтов в TextReader через цепочку потоков (возможно через MemoryStream).

Или, метод DIY:

Вы пытались использовать DataReader?

см .: Конструктор DataReader (Stream, Encoding, Boolean)

Предположительно, вы можете обернуть MemoryStream вокруг вашего байтового массива.

Тогда я думаю, что вы, вероятно, можете передать его в DataAdapter, который мог бы выдать DataSet, из которого вы получите один DataTable ...

Редактировать

Теперь я понимаю, что вы, вероятно, уже рассматривали возможность использования различных компонентов ADO.Net, поскольку упомянули Jet / ODBC.

Я также понимаю, что мой URL для DataReader взят из Biztalk.

Я думал об интерфейсе IDbDataReader, но, конечно, вам нужна конкретная реализация, для которой, вероятно, нет ни одной, которая бы соответствовала вашим требованиям, кроме, возможно, этой в Biztalk (к которой у вас, вероятно, нет доступа).

Может быть, реализовать свой собственный? (Кстати, не серьезное предложение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...