web-dev-qa-db-ja.com

C#を使用したOleDbを使用したCSVの解析

私はこのトピックが死ぬまで行われていることを知っていますが、私は途方に暮れています。

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.

すべてのコードを破棄し、ゼロから始めることを検討しています。私が間違っていることは明らかですか?

21
Zulfi Tapia

接続文字列にはディレクトリ名のみを指定する必要があります。クエリにはファイル名が使用されます。

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パーサー (または 別の1つ )を使用できます。

39
Darin Dimitrov

代替ソリューションは、TextFieldParserクラス(.Netフレームワーク自体の一部)を使用することです https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.visualbasic.fileio.textfieldparser

この方法では、休暇に出かけた他の開発者に依存する必要はありません。私は何度もそれを使用しており、障害にぶつかることはありません。

私はこれを仕事から投稿しました(したがって、サンプルスニペットを投稿することはできません。今晩家に帰るときに投稿します)。

1
Vijay Gill

最初の行には列名が含まれているようなので、次のようにHDR = YESプロパティを含める必要があります。

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

接続文字列を試してください:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""
0
davecoulter
 var  s=@"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\"";