人気ブログランキング | 話題のタグを見る
ExcelでのCSV保存の仕様にやられた
CSVからデータ読み込んで DataGridView に表示する機能をアプリに作ってるんですが、それがどうもうまくいかないというクレームがあり調査すると、17行目移行にカンマがありませんでした。

調べたところ、ExcelでCSV保存するときに、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ファイルを保存すると区切り記号のカンマがなくなる
by jehoshaphat | 2009-09-07 18:52 | .Net開発


<< 公衆無線LANを初めて身近に感じた 携帯向けWEBページの絵文字問題 >>