Эффективный способ SQL CSV с> 255 столбцами в C#? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующий метод OleDb, который мне очень нравится, потому что я могу в конечном итоге передать SQL запросов к csv.

Проблема в том, что OleDb может читать только <256 столбцов, а у меня их больше. </p>

Что является альтернативой эффективному запросу таблицы csv в C# с таким размером столбца?

Я бы хотел избежать переноса всего csv в таблицу данных для более позднего LINQ.

            DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
            {
                string header = isFirstRowHeader ? "Yes" : "No";

                string pathOnly = Path.GetDirectoryName(path);
                string fileName = Path.GetFileName(path);

                string sql = @"SELECT * FROM [" + fileName + "]";

                using (OleDbConnection connection = new OleDbConnection(
                          @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                          ";Extended Properties=\"Text;HDR=" + header + "\""))
                using (OleDbCommand command = new OleDbCommand(sql, connection))
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                {
                    DataTable dataTable = new DataTable
                    {
                        Locale = CultureInfo.CurrentCulture
                    };
                    adapter.Fill(dataTable);
                    return dataTable;
                }
            }

Обновление: попробовал добавить комментарий к предложению следующего сценария для использования драйвера ACE, но следующая строка подключения OleDb по-прежнему содержит только 255 столбцов. Все еще ищу способ достичь sh этого.

using (OleDbConnection connection = new OleDbConnection(
                      "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + pathOnly +"; Extended Properties =\"Text; HDR = Yes; FORMAT = Delimited\""))

1 Ответ

0 голосов
/ 05 августа 2020

Как насчет чего-то вроде этого?:

        static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
        {
            DataTable dataTable = null;

            using (var inStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (var sr = new StreamReader(inStream))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    var fields = line.Split(',');

                    if (dataTable == null) // create datatable based on header row
                    {
                        dataTable = new DataTable();
                        foreach (var field in fields)
                            dataTable.Columns.Add(new DataColumn(field));
                        continue; // don't add header row to rows collection
                    }

                    dataTable.Rows.Add(fields);
                }
            }

            return dataTable;
        }

Если ваша первая строка не является заголовком, вам придется придумать другой подход к именованию столбцов.

...