15

私の C# アプリケーションでは、Microsoft Jet OLEDB データ プロバイダーを使用して CSV ファイルを読み取っています。接続文字列は次のようになります。

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Data;Extended Properties="text;HDR=Yes;FMT=Delimited

その接続文字列を使用して ADO.NET OleDbConnection を開き、次のコマンドで CSV ファイルからすべての行を選択します。

select * from Data.csv

OleDbDataReader を開いて、返される列のデータ型を調べると、スタック内の何かが、ファイル内のデータの最初の行に基づいてデータ型を推測しようとしていることがわかりました。たとえば、CSV ファイルに次のものが含まれているとします。

House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield

House 列に対して OleDbDataReader.GetDataTypeName メソッドを呼び出すと、列にデータ型 "DBTYPE_I4" が指定されていることが明らかになるため、列から読み取られるすべての値は整数として解釈されます。私の問題は、House が文字列であることです。2 行目から House の値を読み取ろうとすると、OleDbDataReader が null を返します。

Jet データベース プロバイダまたは OleDbDataReader に、列を数値ではなく文字列として解釈するように指示するにはどうすればよいですか?

4

4 に答える 4

13

Marc の回答を拡張するには、Schema.ini というテキスト ファイルを作成し、CSV ファイルと同じディレクトリに配置する必要があります。このファイルでは、列の種類だけでなく、ファイル形式、日時形式、地域設定、および列名がファイルに含まれていない場合はそれらを指定できます。

質問で示した例を機能させるには、スキーマ ファイルは次のようになります。

[Data.csv]
ColNameHeader=True
Col1=House Text
Col2=Street Text
Col3=Town Text

データ型を推測する前に、データ プロバイダーがファイル内のすべての行を調べるようにすることもできます。

[Data.csv]
ColNameHeader=true
MaxScanRows=0

実際には、私のアプリケーションは動的な名前を持つファイルからデータをインポートするため、接続を開く前にその場で Schema.ini ファイルを作成し、CSV ファイルと同じディレクトリに書き込む必要があります。

詳細については、http: //msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx を参照するか、MSDN ライブラリで「Schema.ini ファイル」を検索してください。

于 2008-09-22T17:02:46.460 に答える
10

CSV を解釈する方法を ADO.NET に指示する、作成できるスキーマ ファイルがあります。つまり、CSV に構造を与えます。

これを試してください: http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx

または最新のMS ドキュメント

于 2008-09-22T15:50:27.557 に答える
6

チェックしてください

http://kbcsv.codeplex.com/

using (var reader = new CsvReader("data.csv"))
{
    reader.ReadHeaderRecord();
    foreach (var record in reader.DataRecords)
    {
        var name = record["Name"];
        var age = record["Age"];
    }
}
于 2011-10-05T07:28:08.117 に答える