2011-07-25 19 views
20

Wiem, że ten temat został zrobiony na śmierć, ale jestem na końcu rozumu.Parsowanie CSV przy użyciu OleDb przy użyciu C#

Potrzebuję parsować CSV. Jest to dość średni CSV i logika parsowania został napisany przy użyciu OLEDB przez innego dewelopera, który przysięgał, że to działa, zanim udał się na wakacje :)

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, 

Mam problem jest to, że mam różne błędy w zależności od połączenia ciąg, próbuję.

gdy próbuję ciąg połączenia:

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

pojawia się błąd:

'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. 

gdy próbuję ciąg połączenia:

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

lub ciąg połączenia

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

pojawia się błąd:

External table is not in the expected format. 

Zastanawiam wyrzucać cały kod i zaczyna od zera. Czy jest coś oczywistego, co robię źle?

Odpowiedz

33

Powinieneś wskazać tylko nazwę katalogu w ciągu połączenia. Nazwa pliku zostanie użyty do zapytania:

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); 
    } 
} 

I zamiast OleDB można użyć decent CSV parser (lub another one).

+0

Nie mogę ci wystarczająco podziękować! czy możesz wskazać mi jakieś przyzwoite parsery CSV? dodatkowo gdzie mogę przeczytać ciągi połączeń? jest jak dla mnie jak voodoo. –

+1

@Zulfi Tapia, wskazałem na 2 * przyzwoite * parsery CSV na końcu mojej odpowiedzi. –

+0

wielkie dzięki za pomoc! –

0

Wydaje Twój pierwszy wiersz zawiera nazwy kolumn, więc trzeba zawierać HDR = YES właściwość, na przykład:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties="Excel 12.0;HDR=YES"; 
+0

tak, pierwsza kolumna to nagłówki. 'Tabela zewnętrzna nie jest w oczekiwanym formacie.' Still –

0

Spróbuj ciąg połączenia:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\"" 
+0

nopes 'Tabela zewnętrzna nie jest w oczekiwanym formacie. Nadal ... :) –

0
var [email protected]"D:\TEST.csv"; 
string dir = Path.GetDirectoryName(s); 
string sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" 
         + "Data Source=\"" + dir + "\\\";" 
         + "Extended Properties=\"text;HDR=YES;FMT=Delimited\""; 
+0

To przenosi mnie poza dwa błędy, które wspomniałem powyżej, ale ponieważ patrzymy bezpośrednio w katalogu, w jaki sposób określić, który plik wybrać? To zawiesza się i mówi mi: "Aparat bazy danych Microsoft Jet nie mógł znaleźć obiektu" TEST $ .txt ". Upewnij się, że obiekt istnieje i poprawnie przeliteruj jego nazwę oraz nazwę ścieżki. " –