読み込み時に、CSVファイルを使用DataReaderのOLEDBジェットデータプロバイダは、どのようにコントロールできま列データか。
質問
私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
呼び出しのOleDbDataReader.GetDataTypeName方法の欄にすることを明らかにしたカラムは与えられたデータ型"DBTYPE_I4ないように、すべての値から読み取られているとして解釈される整数です。私の問題は、きな文字列が読み込みのハウスの値から次の行のOleDbDataReaderはnullを返します。
どのように伝えられ、ジェットデータベースのプロバイダまたはOleDbDataReaderの解釈カラムを文字列としてではなく数?
解決
あのスキーマファイルを作成できることを教えてくADO.NET どのように扱うかのCSVに有効な構造です。
してみてください: http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx
他のヒント
拡大Marcの答えながらプレーする必要がありますの作成と呼ばれるテキストファイルのスキーマ.iniに入れて同じディレクトリとして、CSVファイルです。どのカラムの種類、このファイルが指定可能なファイルの形式は、日付時刻の形式は、地域設定のカラム名だけに含まれていないファイルです。
の例ったのか、仕事のスキーマファイルはこのようになっているでしょう:
[Data.csv]
ColNameHeader=True
Col1=House Text
Col2=Street Text
Col3=Town Text
私もこのデータプロバイダを検討すべての列をファイル以前ようとするように、データの種類
[Data.csv]
ColNameHeader=true
MaxScanRows=0
現実に自分の輸入からデータファイルダの名前、私をスキーマ.iniファイルに書くのと同じディレクトリとして、CSVファイル以前の私の接続用です。
さらに詳細はこちらをご覧ください- http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx または検索にMSDN図書館内に"Schema.iniファイル".
ご確認ください
using (var reader = new CsvReader("data.csv"))
{
reader.ReadHeaderRecord();
foreach (var record in reader.DataRecords)
{
var name = record["Name"];
var age = record["Age"];
}
}
必要なものを書いたスキャンするすべての行を決定するスキーマ.その場合、最初の数は数字の英数字、英数字の細胞が空白にします。
のように ロリー, 私の作成に必要なスキーマ.iniファイルを動的になる方法はありませんprogramaticallyのドライバをスキャンして行った。(の場合はこの限りではありませんのためにexcelファイル)
が必要です MaxScanRows=0
おschema.ini
このコード例:
public static DataTable GetDataFromCsvFile(string filePath, bool isFirstRowHeader = true)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException("The path: " + filePath + " doesn't exist!");
}
if (!(Path.GetExtension(filePath) ?? string.Empty).ToUpper().Equals(".CSV"))
{
throw new ArgumentException("Only CSV files are supported");
}
var pathOnly = Path.GetDirectoryName(filePath);
var filename = Path.GetFileName(filePath);
var schemaIni =
$"[{filename}]{Environment.NewLine}" +
$"Format=CSVDelimited{Environment.NewLine}" +
$"ColNameHeader={(isFirstRowHeader ? "True" : "False")}{Environment.NewLine}" +
$"MaxScanRows=0{Environment.NewLine}" +
$" ; scan all rows for data type{Environment.NewLine}" +
$" ; This file was automatically generated";
var schemaFile = pathOnly != null ? Path.Combine(pathOnly, "schema.ini") : "schema.ini";
File.WriteAllText(schemaFile, schemaIni);
try
{
var sqlCommand = $@"SELECT * FROM [{filename}]";
var oleDbConnString =
$"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={pathOnly};Extended Properties=\"Text;HDR={(isFirstRowHeader ? "Yes" : "No")}\"";
using (var oleDbConnection = new OleDbConnection(oleDbConnString))
using (var adapter = new OleDbDataAdapter(sqlCommand, oleDbConnection))
using (var dataTable = new DataTable())
{
adapter.FillSchema(dataTable, SchemaType.Source);
adapter.Fill(dataTable);
return dataTable;
}
}
finally
{
if (File.Exists(schemaFile))
{
File.Delete(schemaFile);
}
}
}
だいくつかの変更る場合にはこの同じディレクトリは、複数のスレッドでも同時に行います。