DOBON.NET DOBON.NETプログラミング掲示板過去ログ

CSVファイルをDataTableに取込をしたいです

環境/言語:[Windows7 C#]
分類:[.NET]

CSVファイルがデスクトップにあります。このCSVファイルをDataTableに取り込みたいと思います。

CSVは下記のようなデータになります。
CSVDATA.csv
"aiu","eo","kaki",3,4
"aaa","bbb","ccc",,1
"abc","def","hij",4,

DataTableはあらかじめ、「DataSet.xsd」で定義されています。
DataTableの定義は下記になります。

TABLE1
列名(データ型)
col1(string)
col2(string)
col3(string)
col4(int)
col5(int)

コードは下記のようなコードを書きました。
配列がString型の為に、4列目、5列目の値を読み取ろうとすると
「ArgumentExceptionはハンドルされませんでした。入力文字列の形式が正しくありません。列col4は格納できませんでした。必要な型はInt32です。」
というメッセージが表示されます。

メッセージ通り、Int32型のデータをセットしないといけないのに、空文字が代入されようとしているのでエラーが発生しました。
エラーを発生しないようにするには、どのように対応したらよろしいでしょうか?

よろしくお願いします。

//==============================================================================================================
//CSVファイル読取 TEXTBOXにはパスが設定されている
TextFieldParser csvParser = new TextFieldParser(this.TEXTBOX.Text, Encoding.GetEncoding("shift_jis"));

//CSV1行読み取り用
string[] csvRowData;

//データ読込
while (!csvParser.EndOfData)
{
//1行読込
csvRowData = csvParser.ReadFields();

//行追加
DataRow dtRow = dt.NewRow();

//ReadFieldsで読み取った1行をデータテーブルに追加する。
for (int index = 0; index < dt.Columns.Count; index++)
{
if (csvRowData[index] == null)
{

csvRowData[index] = "0";

//2行目でエラー発生}
dtRow[index] = csvRowData[index];
}
dt.Rows.Add(dtRow);
}
//==============================================================================================================
omniさん、こんばんは。

ご自身で書かれている通り
取得されているのは空文字列ですから、nullと比較しても一致しません。
空文字列と比較してください。


ついでに…
貼り付け加工時に狂ったのでしょうが
「//2行目でエラー発生」のコメントの後に「}」がくっついてます。
落ち着いて…。
■No32065に返信(omniさんの記事)

"aaa","bbb","ccc",,1 で 4 つ目のフィールドから DataTable に代入される
値は 0 でいいのですか?

SQL Server などのデーターベースでいう NULL に相当するということなら、
DataTable には 0 ではなくて DBNull.Value を代入するのではないですか?
とんさん、WebSurferさん

ご回答ありがとうございました。

DBNull.Valueについては知りませんでした。

if(csvRowData[3] == "") dtRow[3] = DBnull.Value;else dtRow[3] = csvRowData[3];
といったようなコードで対応できました。ありがとうございます。

■No32067に返信(WebSurferさんの記事)
> ■No32065に返信(omniさんの記事)
>
> "aaa","bbb","ccc",,1 で 4 つ目のフィールドから DataTable に代入される
> 値は 0 でいいのですか?
>
> SQL Server などのデーターベースでいう NULL に相当するということなら、
> DataTable には 0 ではなくて DBNull.Value を代入するのではないですか?
>
解決済み!
■No32077に返信(omniさんの記事)
> とんさん、WebSurferさん
>
> ご回答ありがとうございました。
>
> DBNull.Valueについては知りませんでした。
>
> if(csvRowData[3] == "") dtRow[3] = DBnull.Value;else dtRow[3] = csvRowData[3];
> といったようなコードで対応できました。ありがとうございます。

DataRowExtensions.SetField<T> メソッド (DataRow, String, T) の使用も
検討されてはいかがですか。

T を int? に設定すれば null を受け付け、自動的に DBNull.Value に変換
してくれます。

ただし、DataRow.Item プロパティを使う場合と違って、string 型から int
型への変換は Int32.TryParse メソッド (String, Int32) などを使って自分
で実装する必要があります。(例えば、T に int? を設定すると null また
は int 型を代入しないとコンパイルエラーになります。面倒な反面、確実さ
は増します)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板