Разбор CSV с использованием OleDb с использованием C#

Я знаю, что эта тема зашла в тупик, но я в тупике.

Мне нужно разобрать csv. Это довольно средний CSV, и логика парсинга была написана с использованием OleDB другим разработчиком, который клялся, что это работает, прежде чем он ушел в отпуск :)

CSV sample:
Dispatch Date,Master Tape,Master Time Code,Material ID,Channel,Title,Version,Duration,Language,Producer,Edit Date,Packaging,1 st TX,Last TX,Usage,S&P Rating,Comments,Replace,Event TX Date,Alternate Title
,a,b,c,d,e,f,g,h,,i,,j,k,,l,m,,n,

У меня проблема в том, что я получаю различные ошибки в зависимости от строки подключения, которую я пытаюсь использовать.

когда я пытаюсь использовать строку подключения:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited"

Я получаю сообщение об ошибке:

'D:\TEST.csv' is not a valid path.  Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.

Когда я пробую строку подключения:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0;

или строка подключения

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=Excel 8.0;

Я получаю сообщение об ошибке:

External table is not in the expected format.

Я подумываю выбросить весь код и начать с нуля. Есть ли что-то очевидное, что я делаю неправильно?


person Zulfi Tapia    schedule 25.07.2011    source источник


Ответы (5)


Вы должны указать только имя каталога в строке подключения. Имя файла будет использоваться для запроса:

var filename = @"c:\work\test.csv";
var connString = string.Format(
    @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", 
    Path.GetDirectoryName(filename)
);
using (var conn = new OleDbConnection(connString))
{
    conn.Open();
    var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]";
    using (var adapter = new OleDbDataAdapter(query, conn))
    {
        var ds = new DataSet("CSV File");
        adapter.Fill(ds);
    }
}

А вместо OleDB можно использовать приличный анализатор CSV (или еще один).

person Darin Dimitrov    schedule 25.07.2011
comment
Я не могу тебя отблагодарить! Можете ли вы указать мне несколько приличных парсеров csv? кроме того, где я могу прочитать строки подключения? это похоже на вуду для меня на данный момент. - person Zulfi Tapia; 25.07.2011
comment
@Zulfi Tapia, я указал вам на 2 достойных парсера CSV в конце моего ответа. - person Darin Dimitrov; 25.07.2011
comment
Я предложил другой альтернативный парсер CSV, и он тоже от Microsoft. См. мой ответ ниже, который начинается с «Альтернативное решение...» - person Vijay Gill; 26.07.2011
comment
stackoverflow.com/questions/6455909/ - person arun kumar non ascii; 26.07.2011
comment
У меня работало с пробелом в имени файла. Спасибо за простое, чистое решение! - person CraigP; 09.06.2017
comment
Я хотел бы использовать приличные синтаксические анализаторы csv, но, как это становится довольно распространенным в наши дни, неразумные органы ИТ-отдела продолжают ограничивать и блокировать компьютеры. Мне нужно создать что-то, протестировать его на другой машине в vs, а затем использовать его только в пакете сценариев SSIS. - person Eddy Jawed; 17.05.2018
comment
Я использовал тот же код, но код не генерирует исключения, но данные не копируются в таблицу. - person santhosha; 16.06.2020

Альтернативным решением является использование класса TextFieldParser (часть самого фреймворка .Net). nofollow noreferrer">https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.textfieldparser

Таким образом, вам не придется полагаться на другого разработчика, который ушел в отпуск. Я использовал его так много раз и не наткнулся ни на одну загвоздку.

Я опубликовал это с работы (поэтому я не могу опубликовать пример фрагмента. Я сделаю это, когда пойду домой сегодня вечером).

person Vijay Gill    schedule 25.07.2011
comment
Краткий пример был бы отличным дополнением к этому ответу. - person Carol; 04.03.2019
comment
@ Кэрол - я так и сделаю. Должно быть, я разместил ответ, пока был на работе, и, следовательно, не мог опубликовать пример. Я сделаю это сегодня вечером, когда пойду домой. - person Vijay Gill; 07.03.2019
comment
@ Кэрол Их довольно много. Это я разместил здесь на SO некоторое время назад. - person Nyerguds; 07.03.2019

Кажется, ваша первая строка содержит имена столбцов, поэтому вам нужно включить свойство HDR=YES, например:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties="Excel 12.0;HDR=YES";
person Edwin de Koning    schedule 25.07.2011
comment
да, первый столбец - это заголовки. External table is not in the expected format. еще - person Zulfi Tapia; 25.07.2011

Попробуйте строку подключения:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""
person davecoulter    schedule 25.07.2011
comment
нет External table is not in the expected format. еще... :) - person Zulfi Tapia; 25.07.2011

person    schedule
comment
Это уводит меня от двух ошибок, о которых я упоминал выше, но, поскольку мы смотрим непосредственно на каталог, как мне указать, какой файл выбрать? Он вылетает и говорит мне The Microsoft Jet database engine could not find the object 'TEST$.txt'. Make sure the object exists and that you spell its name and the path name correctly. - person Zulfi Tapia; 25.07.2011