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 ファイルの内容を表示させることができました。
[ もどる ]