C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CSVファイルをDataTableに格納


(過去ログ 72 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■42180 / inTopicNo.1)  CSVファイルをDataTableに格納
  
□投稿者/ Travian (11回)-(2009/10/09(Fri) 10:40:38)

分類:[.NET 全般] 

.Net Framework3.5
Visual Studio C# 2008

CSVファイルをDataTableに読み込み
そのDataTableをDataGridViewのDataSourceに指定し、
m_DataTable.Rows.Add(new Object[] {"99","-","-","-"});
などでデータを追加表示しようとしています。

OLEDBとschema.iniを使用する方法でやることにし、
以下のコードを書きました。

            string conString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                               "Data Source=" + directoryPath + ";"+
                               "Extended Properties=" + "\"Text;HDR=Yes;FMT=Delimited\"";
            System.Data.OleDb.OleDbConnection con =
                new System.Data.OleDb.OleDbConnection(conString);

            con.Open();

            string commText = "SELECT * FROM [" + fileName + "]";
            System.Data.OleDb.OleDbDataAdapter da =
                new System.Data.OleDb.OleDbDataAdapter(commText, con);

            m_DataTable = new DataTable();

            da.Fill(m_DataTable);

            con.Close();

            dataGridView1.DataSource = m_DataTable;

■schema.ini
[金属.csv]
ColNameHeader=True
Format=CSVDelimited
TextDelimiter=none
Col1=No Char Width 20
Col2=製造番号 Char Width 80
Col3=銀 Char Width 50
Col4=銅 Char Width 50

schema.iniと金属.csvは
directoryPath に置いてあります。



そこで問題が発生しました。
金属.csvの内容は
1,DA112,22.2,11.2
2,DA113,21.2,12.2
3,DA114,12.2,14.2

といった内容なのですが
schema.iniのChar指定が無視されているかのように

m_DataTable.Rows.Add(new Object[] {"","","",""});
を実行したところで
以下の例外が発生します。

入力文字列の形式が正しくありません。列 銀 に <-> を格納できませんでした。 必要な型は Double です。


OLEDBを使用すると
内容を解読する際に、自動で型を決めるといった記述を
Web検索で見つけましたが、
schema.iniで明示的に指定できるはずですよね?

無視されているということは
どこか記述が間違っているのでしょうか?

読み込んで、DataGridViewに
ファイルの内容が表示されるとこまでは動作確認できているのですが
m_DataTable.Rows.Add(new Object[] {"99","-","-","-"});
でこけます。

説明不足な点があるかもしれませんが
アドバイスお願い致します。

引用返信 編集キー/
■42185 / inTopicNo.2)  Re[1]: CSVファイルをDataTableに格納
□投稿者/ 魔界の仮面弁士 (1349回)-(2009/10/09(Fri) 12:46:14)
No42180 (Travian さん) に返信
> 以下のコードを書きました。
提示頂いた条件で実行してみましたが、例外は発生しませんでした。
(schema.ini を空にした場合は発生しましたが)


> 金属.csvの内容は
> 1,DA112,22.2,11.2
> 2,DA113,21.2,12.2
> 3,DA114,12.2,14.2
データ側にはヘッダ行が無いのでしょうか? だとしたら、
> "Extended Properties=" + "\"Text;HDR=Yes;FMT=Delimited\"";

> ColNameHeader=True
という指定は NG です。これだと、「1」列や「DA112」列が生成されてしまいます。


それはともかくとして、CSV 側にヘッダが無いにも関わらず、今回の処理において
> 入力文字列の形式が正しくありません。列 銀 に <-> を格納できませんでした。 必要な型は Double です。
と『銀』列が認識されているのであれば、schema.ini 自体は利用されているはずです。

> m_DataTable.Rows.Add(new Object[] {"","","",""});
> を実行したところで
> 以下の例外が発生します。
> 入力文字列の形式が正しくありません。列 銀 に <-> を格納できませんでした。 必要な型は Double です。
m_DataTable.Rows.Add(new Object[] {"","","",""}); ではなく、
m_DataTable.Rows.Add(new Object[] {"99","-","-","-"}); なのでは?
引用返信 編集キー/
■42192 / inTopicNo.3)  Re[1]: CSVファイルをDataTableに格納
□投稿者/ もりお (103回)-(2009/10/09(Fri) 14:22:44)
No42180 (Travian さん) に返信
銀の列だけが間違って認識されているのでしょうか。
こんな具合で確認されてみてはいかがでしょうか。
For Each column As DataColumn In m_DataTable.Columns
    System.Diagnostics.Debug.WriteLine( _
        String.Format("name:{0} type:{1}", column.ColumnName, column.DataType))
Next

schema.ini は shift_jis で保存しないと読み込んでもらえないのですね。
小一時間悩んでしまいました。

引用返信 編集キー/
■42193 / inTopicNo.4)  Re[2]: CSVファイルをDataTableに格納
□投稿者/ 魔界の仮面弁士 (1350回)-(2009/10/09(Fri) 14:40:49)
No42192 (もりお さん) に返信
> schema.ini は shift_jis で保存しないと読み込んでもらえないのですね。

UTF-16 でもいけますよ。JET と Windows のバージョンにもよりますけれども。
引用返信 編集キー/
■42203 / inTopicNo.5)  Re[3]: CSVファイルをDataTableに格納
□投稿者/ もりお (104回)-(2009/10/09(Fri) 16:21:35)
No42193 (魔界の仮面弁士 さん) に返信
> UTF-16 でもいけますよ。JET と Windows のバージョンにもよりますけれども。

おお、出来ました。UTF-16 で読み込めました。ありがとうございます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -