3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

ExcelでのCSV保存の仕様にやられた

CSVからデータ読み込んで DataGridView に表示する機能をアプリに作ってるんですが、それがどうもうまくいかないというクレームがあり調査すると、17行目移行にカンマがありませんでした。

調べたところ、ExcelCSV保存するときに、17行目移行のブランクセルについてカンマを入れないのは仕様みたいです。

詳しくは、MSサポート:[XL2002]CSV形式で保存した際カンマの数が17行以降異なるを参照。

上記サポートでは2002以前となってますが、2003でも起きるようです。

対応策として、読み込むアプリ側でなんとかすることとしました。

TextFieldParser を使って1行のデータを配列として取得し、DataRow に入れてるんですが、カンマが無い場合だと DataRow の中の値が DBNull になるっぽいです。

なので、DBNull ならカンマありの時と同じように空文字を入れるようにしました。

'データテーブル

Dim dt As New DataTable

Dim row As DataRow

dt.Columns.Add("列1", Type.GetType("System.String"))

dt.Columns.Add("列2", Type.GetType("System.String"))

dt.Columns.Add("列3", Type.GetType("System.String"))

 

'カンマ区切りテキストを読み込み、データテーブルに追加

Dim parser As New FileIO.TextFieldParser("C:\a.csv", System.Text.Encoding.GetEncoding("Shift_JIS"))

parser.TextFieldType = FileIO.FieldType.Delimited 'フィールドが区切られていることを指定

parser.SetDelimiters(",") ' 区切り文字はコンマ

 

' データを読み込んでデータテーブルにセット

While Not parser.EndOfData

row = dt.NewRow

row.ItemArray = parser.ReadFields

'Excel2003以前でで16行目移行にカンマがつかずDBNullになってしまう対応

For i As Integer = 0 To dt.Columns.Count - 1

If row(i) Is DBNull.Value Then

row(i) = String.Empty

End If

Next

dt.Rows.Add(row)

End While

 

Call parser.Close()

 

'データグリッドビューにセット(dgvDataImportはDataGridView)

dgvDataImport.DataSource = dt

参考:

cybozu.net エクセルスキル:CSVファイルを保存すると区切り記号のカンマがなくなる