どうも!リョクちゃです。
今回は、データテーブルと呼ばれる型について使い方やどんな応用があるか
例を交えて紹介していきます。
データテーブルとは、Excelの表をやデータベースを知っている読者なら、
データベース上に構築するテーブル、といった方がわかりやすいかもしれません。
ちなみに前回はこちら
 
目次
データテーブル:DataTable
DataTableと書かれ、VB.Netでは、DataSetと呼ばれる型の子要素になります。
DataSetが親要素でDataTableがそれの子要素といったモノです。
イメージでいうと、下図の感じになります。
※Excelを例に解説しています。

DataTableを扱う上では、DataSetとの関係を覚えておきましょう。
今回はDataSetについては、深く触れませんが、いずれ紹介をしていきます。
データテーブルの構成
DataTableを構成する要素としては、DataRowと呼ばれる要素があります。
これはDataTableの子要素で、1行分のデータを表しています。
先ほどの図に描き加えると、下のようになります。

Sheetの中にDataRowがあり、これはSheet内の1行分のデータをそれぞれ表しています。
実際にExcelを使って説明すると、

ここでBook1がDataSet、
Book1で表示されているSheetがDataTable、
赤枠で囲まれた1行のデータをDataRowとそれぞれ表されます。
※ Excelを例に説明しているので、Excel自体がこのような構成というわけではありません。
このような関係性を持った型をDataTable型と呼びます。
 
データテーブルの作り方
それでは早速、データテーブルを作っていきます。
作るにはまず、変数として宣言をする必要があります。
宣言の仕方は、下のようなコードになります。
| 1 2 3 4 5 6 7 | Class DataTableTest     Public Sub Main()         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing     End Sub End Class | 
変数dtTestをDataTable型で宣言をしています。
初期値をNothing(空)にしています。
宣言しただけでは使えないので、インスタンスを作成してあげます。
| 1 2 3 4 5 6 7 8 9 10 | Class DataTableTest     Public Sub Main()         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing         ' インスタンスを作成         dtTest = New DataTable     End Sub End Class | 
Newを使って、インスタンスを作成しています。
これで使えるようになりました。
データテーブルにデータを入れる準備
作った変数dtTestは、まだ空っぽの状態なので、データを入れる準備をしてあげます。
まず、今回のデータテーブルの目的として、先ほどのイメージ図で示した内容を
データテーブルに入れていくことを目的とします。(下図参照)

図1 テスト用データ
データテーブルに列を追加する
図1の緑色の行をみてみましょう。
これはヘッダー行というものになります。
ヘッダーとはデータの先頭を表す言葉で、ヘッダー行は先頭行と言われます。
ここでは先頭行は見出しとして扱います。
そのために列として追加してあげる必要があります。
列の追加は下のようなコードになります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Class DataTableTest     Public Sub Main()         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing         ' インスタンスを作成         dtTest = New DataTable         ' データテーブルに列を追加する         dtTest.Columns.Add("No")         dtTest.Columns.Add("Item_1")         dtTest.Columns.Add("Item_2")         dtTest.Columns.Add("Item_3")     End Sub End Class | 
dtTest.Columns.Add(“追加する列名”)で列を追加することができます。
ここでは、図1のNoからItem_3までを列として追加しています。
ここまでを実行し、dtTestの中身を見ていくと、下の図のようになります。

列として、NoからItem_3が追加されているのがわかります。
※ DataTableビジュアライザーはDataTable型で
作成した変数の状況を可視化してくれるツールです。
データテーブルに値を追加する
列の追加ができたので、それぞれの列に値を追加していきましょう。
追加するには、下のようなコードになります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Class DataTableTest     Public Sub Main()         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing         ' インスタンスを作成         dtTest = New DataTable         ' データテーブルに列を追加する         dtTest.Columns.Add("No")         dtTest.Columns.Add("Item_1")         dtTest.Columns.Add("Item_2")         dtTest.Columns.Add("Item_3")         ' データテーブルの各列に値を追加する         dtTest.Rows.Add()  ' データテーブルに新たな行を追加         dtTest.Rows(0).Item("No") = "1"         dtTest.Rows(0).Item("Item_1") = "りんご"         dtTest.Rows(0).Item("Item_2") = "ばなな"         dtTest.Rows(0).Item("Item_3") = "とまと"     End Sub End Class | 
データテーブルの各列に値を追加する前に、新しい行をデータテーブル内に作成しています。
これを忘れてしまうと、次の処理でエラーが起きてしまいます。
新たに行を追加したら、追加した行に対して値をそれぞれ入れていきます。
この際に、新しい行を追加していないと次の処理で存在しない行に値を入れようとしています
といったエラーに見舞われてしまうのです。
順番としては以下の流れを守りましょう。
- 新しい行を追加
- 追加した行に値を追加
dtTest.Rows(0).Item(“No”)とすることで、
0番目の行のNo列に値を追加するといった処理を行っています。
ここでは、No列には1を入れています。
全て入れた状態で、DataTableビジュアライザーを見てみると、
下のようになります。

追加されているのが確認できました。
それでは、続いて他の行も追加していきます。
コードは下のようになります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Class DataTableTest     Public Sub Main()         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing         ' インスタンスを作成         dtTest = New DataTable         ' データテーブルに列を追加する         dtTest.Columns.Add("No")         dtTest.Columns.Add("Item_1")         dtTest.Columns.Add("Item_2")         dtTest.Columns.Add("Item_3")         ' データテーブルの各列に値を追加する         dtTest.Rows.Add()  ' データテーブルに新たな行を追加         dtTest.Rows(0).Item("No") = "1"         dtTest.Rows(0).Item("Item_1") = "りんご"         dtTest.Rows(0).Item("Item_2") = "ばなな"         dtTest.Rows(0).Item("Item_3") = "とまと"         dtTest.Rows.Add()  ' データテーブルに新たな行を追加         dtTest.Rows(1).Item("No") = "2"         dtTest.Rows(1).Item("Item_1") = "なす"         dtTest.Rows(1).Item("Item_2") = "ぴーまん"         dtTest.Rows(1).Item("Item_3") = "きゅうり"         dtTest.Rows.Add()  ' データテーブルに新たな行を追加         dtTest.Rows(2).Item("No") = "3"         dtTest.Rows(2).Item("Item_1") = "いぬ"         dtTest.Rows(2).Item("Item_2") = "ねこ"         dtTest.Rows(2).Item("Item_3") = "さる"     End Sub End Class | 
全てを追加していくと、このようになります。
ただこれだと、ひたすらコードが長々となってしまうので、
一般的にはFor文やFor Each文などの繰り返し処理を使って、
データテーブルに値を追加していきます。
応用例:CSVファイルで読み込んだ値を追加
応用例として、CSVファイルの内容を読み込んで
データテーブルに格納していく方法を紹介していきます。
まず、下のようなCSVファイルを準備します。

これを読み取って、データテーブルに追加していきます。
CSVファイルの読み取り方については、前回の記事を参考ください。
※ 前回の記事のコードを使っていきます。
実際のコードが下のコードになります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | Class DataTableTest     Public Sub Main()         ' CSVファイルの内容を読み込んでデータテーブルに入れていく         ' データテーブル型の変数を宣言         Dim dtTest As DataTable = Nothing         ' インスタンスを作成         dtTest = New DataTable         ' データテーブルに列を追加する         dtTest.Columns.Add("No")         dtTest.Columns.Add("Item_1")         dtTest.Columns.Add("Item_2")         dtTest.Columns.Add("Item_3")         ' CSVファイルを読み込む変数の準備         Dim sr As System.IO.StreamReader = Nothing         '  CSVファイルが存在するかチェック         If System.IO.File.Exists("./Test.csv") Then             ' CSVファイルがあれば処理を行う             ' インスタンス作成             sr = New System.IO.StreamReader("./Test.csv")             '  CSVファイルを最後まで読み取り             Dim dCnt As Integer = 0  ' カウント変数をデータテーブル用に準備             While sr.Peek >= 0                 Dim line As String() = sr.ReadLine.Split(","c)                 ' データテーブルに値を追加していく                 dtTest.Rows.Add()                 dtTest.Rows(dCnt).Item("No") = line(0)                 dtTest.Rows(dCnt).Item("Item_1") = line(1)                 dtTest.Rows(dCnt).Item("Item_2") = line(2)                 dtTest.Rows(dCnt).Item("Item_3") = line(3)                 dCnt += 1  ' カウント変数を+1していく             End While         End If     End Sub End Class | 
While文の中で、データテーブルに値を追加していく処理を記述しています。
ここで変数dCntを用意したのは、
新たに行を追加して追加した行に対して正常に値を入れるといった役割があります。
わざわざ変数dCntを用意しなくてもいいのですが、
ここでは難しく考えずシンプルにしています。
実際に変数dCntを用意しないで書くと、下のようなコードになります。
※ 抜粋して載せているので必要に応じて実行される方は書き換えてみてください。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |         '  CSVファイルが存在するかチェック         If System.IO.File.Exists("./Test.csv") Then             ' CSVファイルがあれば処理を行う             ' インスタンス作成             sr = New System.IO.StreamReader("./Test.csv")             '  CSVファイルを最後まで読み取り             While sr.Peek >= 0                 Dim line As String() = sr.ReadLine.Split(","c)                 ' データテーブルに値を追加していく                 dtTest.Rows.Add()                 dtTest.Rows(dtTest.Rows.Count - 1).Item("No") = line(0)                 dtTest.Rows(dtTest.Rows.Count - 1).Item("Item_1") = line(1)                 dtTest.Rows(dtTest.Rows.Count - 1).Item("Item_2") = line(2)                 dtTest.Rows(dtTest.Rows.Count - 1).Item("Item_3") = line(3)             End While         End If | 
dtTest.Rows.Countで行数のカウントをし、この結果から-1した行に
値を追加するといった処理をしています。
まとめ
データテーブル型を使うには、
- 変数としてDataTable型を宣言する。
- インスタンスを作成する。
- 必要となる列を準備する。 → データテーブル変数.Columns.Add(列名)
- 新しい行を追加する。 → データテーブル変数.Rows.Add()
- 追加した行に値を追加する。 → データテーブル変数.Rows(値を追加する行).Item(列名)
といった流れで行います。
データテーブルの全ての行数を取得するには、
データテーブル変数.Rows.Count
ご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。



