C # чтение CSV-файла дает неверный путь - PullRequest
25 голосов
/ 22 сентября 2009

Не получается прочитать файл .csv, используя следующую строку подключения:

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\countrylist.csv");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();

выдает следующую ошибку:

'D: \ arrgh \ arrgh \ Uploads \ countrylist.csv' не является допустимым путем. Убедитесь, что путь указан правильно и что вы подключены к серверу, на котором находится файл.

Я проверил, что файл там. Что здесь происходит?

Ответы [ 7 ]

56 голосов
/ 22 сентября 2009

Хорошо, я вырыл немного дальше, и кажется, что моя строка подключения неверна. В случае файлов CSV вы указываете не реальное имя файла, а каталог, к которому он относится, например.

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();
var cmd = new OleDbCommand("SELECT * FROM [countrylist.csv]", oledbConn);

И вы указываете имя файла в SelectCommand. Какой странный способ сделать это. Это работает для меня сейчас.

4 голосов
/ 22 сентября 2009

Я рекомендую вам использовать синтаксический анализатор CSV, а не поставщика данных OLEDB.

Поиск, и вы найдете много (свободных) кандидатов. Вот несколько, которые работали для меня:

Портативный и эффективный универсальный анализатор для плоских файлов (самый простой в использовании, IMO)
Быстрый CSV Reader (простой в использовании, отлично подходит для больших наборов данных)
FileHelpers библиотека (гибкая, включает генераторы кода, немного кривой обучения)

Как правило, они позволяют вам указывать свойства вашего CSV (разделитель, заголовок, квалификатор текста и т. Д.), И при вызове метода ваш CSV сбрасывается в какую-то структуру данных, такую ​​как DataTable или List <> .

Если вы вообще будете работать с CSV, стоит проверить парсер CSV.

2 голосов
/ 22 сентября 2009

Если вы просто пытаетесь прочитать файл CSV с помощью C #, проще всего использовать класс Microsoft.VisualBasic.FileIO.TextFieldParser . Он фактически встроен в .NET Framework, а не является сторонним расширением.

Да, это в Microsoft.VisualBasic.dll, но это не значит, что вы не можете использовать его из C # (или любого другого языка CLR).

Вот пример использования, взятый из документации MSDN :

Using MyReader As New _
Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt")
   MyReader.TextFieldType = FileIO.FieldType.Delimited
   MyReader.SetDelimiters(",")
   Dim currentRow As String()
   While Not MyReader.EndOfData
      Try
         currentRow = MyReader.ReadFields()
         Dim currentField As String
         For Each currentField In currentRow
            MsgBox(currentField)
         Next
      Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
      MsgBox("Line " & ex.Message & _
      "is not valid and will be skipped.")
      End Try
   End While
End Using

Опять же, этот пример в VB.NET, но было бы тривиально перевести его на C #.

2 голосов
/ 22 сентября 2009

Способ объединения путей и имен файлов заключается в использовании:

fullFilename = System.IO.Path.Combine(folderfilepath, Filename);

в вашем примере:

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv");
1 голос
/ 22 сентября 2009

У меня была такая же проблема несколько недель назад, когда я пытался выполнить автоматизацию Office 2007, и потратил слишком много времени, пытаясь ее исправить.

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";
0 голосов
/ 06 ноября 2012

попробуйте это, быстрый CSV Reader, эффективный анализатор CSV

CSVReader

0 голосов
/ 22 сентября 2009

Если диск D является подключенным сетевым диском, возможно, вам потребуется использовать UNC-путь:

\\computerName\shareName\path\
...