web-dev-qa-db-de.com

Parsen von CSV mit OleDb mit C #

Ich weiß, dass dieses Thema tot ist, aber ich bin am Ende.

Ich muss eine csv analysieren. Es ist ein ziemlich durchschnittlicher CSV und die Analyselogik wurde mit OleDB von einem anderen Entwickler geschrieben, der schwor, dass es funktioniert, bevor er in den Urlaub ging :)

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,

Das Problem, das ich habe, ist, dass ich verschiedene Fehler bekomme, abhängig von der Verbindungszeichenfolge, die ich versuche.

wenn ich die Verbindungszeichenfolge versuche:

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

Ich bekomme den Fehler:

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

Wenn ich die Verbindungszeichenfolge versuche:

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

oder die Verbindungszeichenfolge

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

Ich bekomme den Fehler:

External table is not in the expected format.

Ich überlege mir, den gesamten Code wegzuwerfen und von vorne zu beginnen. Gibt es etwas offensichtliches, was ich falsch mache?

20
Zulfi Tapia

Sie sollten nur den Verzeichnisnamen in Ihrer Verbindungszeichenfolge angeben. Der Dateiname wird zur Abfrage verwendet:

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

Anstelle von OleDB können Sie auch einen anständigen CSV-Parser (oder einen anderen ) verwenden.

37
Darin Dimitrov

Anscheinend enthält Ihre erste Zeile die Spaltennamen. Daher müssen Sie die Eigenschaft HDR = YES wie folgt angeben:

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

Versuchen Sie die Verbindungszeichenfolge:

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

Alternative Lösung http://msdn.Microsoft.com/de-de/library/x710fk43(v=VS.100).aspx

Auf diese Weise müssen Sie sich nicht auf andere Entwickler verlassen, die in den Urlaub gegangen sind. Ich habe es schon so oft benutzt und keinen Haken getroffen.

0
Vijay Gill
 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\"";