CSV を読み込んで DataGridView に表示する - Visual C# プログラミング

PROGRAM


CSV を読み込んで DataGridView に表示する

Visual C# で、CSV ファイルの内容を読み込んで、それを DataGridView に表示する方法について整理してみます。

ここでは CSV を ADO.NET (OLE DB) を使って DataSet クラスに読み込んで、その内容を編集して DataTable クラスに書き込み、それを DataGridView で表示するという流れで実現します。

 

そのために、まずは CSV ファイルを読み込む処理を行うソースコードの冒頭で、次のように宣言します。

using System.Data.OleDb;

これで OLE DB を利用する準備が整いました。

 

続いて、DataSet 型の変数に、"filename" 変数で渡された CSV ファイルの内容を ADO.NET を使って読み込みます。

OleDbConnection connection;

OleDbCommand command;

OleDbDataAdapter adapter;

 

// データを格納する DataSet を初期化します。

DataSet dataset = new DataSet();

 

// OLE DB 接続を初期化します。CSV ファイルを読み込む場合には、ここの Data Source で、CSV ファイルが保存されているフォルダーを指定する必要があります。

connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Path.GetDirectoryName(filename) + "\\; Extended Properties=\"Text;HDR=YES;FMT=Delimited\"");

 

// CSV を読み込むための SQL 文です。CSV ファイルを読み込む場合には、ここの FROM 句のテーブル名では、CSV ファイル名を指定する必要があります。

command = new OleDbCommand("SELECT [対象日付], [表示利用者番号], [顧客名], [開始時間], [終了時間], [サービス内容], [割り当て所員] FROM [" + Path.GetFileName(filename) + "]", connection);

 

// 念のため DataSet の中身を消去します。

dataset.Clear();

 

// OleDbDataAdapter を、先ほど定義した OleDbCommand を使って初期化して、DataSet に CSV ファイルの内容を読み込みます。

adapter = new OleDbDataAdapter(command);

adapter.Fill(dataset);

注目点としては、CSV ファイルを OLE DB を使って読み込む場合は、OleDbConnection の接続文字列の Data Source ではその CSV ファイルが保存されているフォルダー名を指定して、CSV のファイル名は OleDbCommand 内のテーブル名で指定するというところでしょうか。

また、ここでは CSV ファイルの 1 行目がフィールド名になっている前提で、OleDbConnection の接続文字列で "HDR=YES" を指定し、OleDbCommand 内の SQL 文では、そこに記載されたフィールド名を使用しています。

 

それともうひとつ大きな注意点として、OleDbCommand の FROM 句の後に記す CSV ファイル名は、必ず "[" と "]" で括ってあげるようにします。このようにしないと、ファイル名に空白文字があった場合に、OleDbDataAdapter の Fill メソッドが SQL 文のエラーとなってしまいます。

ただ、このようにしても、ファイル名に "]" が入っている場合には SQL 構文エラーになってしまうので、これではまだ完全ではない感じです。回避策がないものかと試に "]" を "]]" に置き換えてみましたけど、変わらず SQL 構文エラーとなってしまいましたので、何らかの対策を考える必要がありそうです。

とりあえず、今回はこのままにしておくことにします。

 

以上で DataSet に CSV ファイルからデータが読み込めたので、これを使って DataGridView にデータを写し込んでいきます。

// 任意のテーブル名で DataTable を初期化します。

DataTable table = new DataTable("明細テーブル")

 

// DataTable の列名を設定します。

table.Columns.Add("利用者");

table.Columns.Add("対象日時");

table.Columns.Add("対象時間");

table.Columns.Add("サービス内容");

table.Columns.Add("割り当て所員");

 

// DataSet に取り込んだ CSV を、行毎にデータを加工して、DataTable にその値を書き込みます。

for (int line = 0; line < dataset.Tables[0].Rows.Count; line++)

{

// DataSet の中の対象行を data 変数に設定します。

DataRow data = dataset.Tables[0].Rows[line];

 

// DataTable に追加する行を Object 型の配列で用意します。

Object[] new_row = new Object[]

{

String.Format(@"{0} ({1})", data["顧客名"], data["表示利用者番号"]),

data["対象日付"],

String.Format(@"{0} 〜 {1}", data["開始時間"], data["終了時間"]),

data["サービス内容"],

data["割り当て所員"]

};

 

// 用意した行を DataTable に追加します。

table.Rows.Add(new_row);

}

 

// CSV ファイルを編集したデータを保持する DataTable を DataGridView の DataSource に設定します。

datagrid.DataSource = table;

なお、CSV から取り込んだデータの編集が不要な場合には、dataset.Tables[0] を直接 DataGridView の DataSource に設定してあげる形でも大丈夫です。

// DataSet が持つ DataTable を直接 DataGridView の DataSource に設定することも可能です。

datagrid.DataSource = dataset.Tables[0];

以上のような感じにすることで、DataGridView に CSV ファイルの内容を表示させることができました。

 


[ もどる ]