- PR -

OleDbDataAdapter による CSVデータの読込み

1
投稿者投稿内容
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2005-03-23 22:18
OleDbDataAdapter を利用して、CSVデータの読込むプログラムを開発していますが、Fill() の際に自動的に設定される DataColumn の型で、問題が発生しています。

===============================================
string sql = "SELECT * FROM test.csv";
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Temp\\;Extended Properties='text;HDR=No;FMT=Delimited;'";
OleDbDataAdapter adp = new OleDbDataAdapter(sql,conn);

DataSet ds = new DataSet();
adp.Fill(ds,"TestData");
===============================================

===== test.csv の内容 =========================
1,"hoge",2005/3/18
2,"hoge",2005/3/18
  (中略)
26,"hoge",2005/3/18
85000000000,"meke",2005/3/18
===============================================

これを実行すると、各カラムのデータ型は
1カラム目:int
2カラム目:string
3カラム目:dateTime
となっています。おそらくこれは、1行目のデータで自動的に判断していると思われます。

ここで問題なのが、最終行のデータです。1カラム目は11桁あり、int の範囲を超えている為、Fill() をしても DBNull となってしまいます。当然、int 型なのでこの数値は格納できないからだと推測されます。

このデータ型の判定機能についていろいろ調査しましたが、先頭25行分の内容から判断して、各カラムの属性を判断しているように思われます。

もしや、DataColumn のデータ型(DataType プロパティ)を強引に変更すればよいのでは?と思い、 試してみましたが NG でした。

なんとかして、test.csv の最終行の1カラム目を正しく読み出したいのですが、何かプログラムに問題があるのでしょうか。
もし、お分かりの方がいらっしゃいましたらご教授いただければ幸いです。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-03-24 00:07
型指定のあるデータセットを作っておくのはどうですか?
といっても私はOLEdbAdapterとかのコントロールをぺたぺた
貼り付けてそれからデータセットを作る方法しかわかりませんけど。
もぐ
会議室デビュー日: 2002/12/06
投稿数: 13
投稿日時: 2005-03-24 00:21
schema.iniは使えないでしょうか?
データと同じディレクトリに準備します。
---- たとえばこんな感じで ----
[test.csv]
Col1=F1 Char Width 20
Col2=F2 Char Width 255
Col3=F3 Date
--------------------
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2005-03-24 17:59
型指定のある DataSet でもだめでした。やはり読み出すときに、データの先頭の何行かでサンプリングして最適と思われる型を決定しているようです。

ということで、もぐさんのおっしゃるとおり、schema.ini による明示的な型指定が必要のようです。
この件で、いろいろ調べていたら同様の件で、やはり同様の現象で悩んでいる方がいました。

http://www.ken3.org/asp/backno/asp101.html

さらに、よくよくヘルプを見たら、英語ですがこの件について書いてありました。
http://support.microsoft.com/default.aspx?scid=kb;ja;257819
データ型を推測するためにスキャンする行数はMaxScanRowsで指定するようです。

データ推測はある意味よくできているのですが、今回のような場合はちょっと辛いですね。

1

スキルアップ/キャリアアップ(JOB@IT)