CSV ファイルの読み込み
CSV(Comma-Separated Values) は、各行のフィールドが「,(カンマ)」で区切られた表形式のデータです。 例えば以下のような表があるとします。
| 氏名 | 身長 | 体重 |
|---|---|---|
| A さん | 171.9 | 64.3 |
| B さん | 157.4 | 51.1 |
| C さん | 171.6 | 64.3 |
| D さん | 168.5 | 55.2 |
| E さん | 162.1 | 61.4 |
これを CSV 形式で格納したファイルの中身は以下のようになっています。
氏名,身長,体重
A さん,171.9,64.3
B さん,157.4,51.1
C さん,171.6,64.3
D さん,168.5,55.2
E さん,162.1,61.4
1 行目はヘッダーとなっており、それぞれの列の名前となります。
上記を table.csv として data フォルダ内に保存しておきます。
この表のデータを順番に出力するプログラムは以下のようになります。
Table table = loadTable("table.csv", "header");
for (int i = 0; i < table.getRowCount(); ++i) {
TableRow row = table.getRow(i);
println("氏名: " + row.getString(0));
println("身長: " + row.getFloat(1));
println("体重: " + row.getFloat(2));
println();
}
実行結果は以下のようになります。
氏名: A さん
身長: 171.9
体重: 64.3
氏名: B さん
身長: 157.4
体重: 51.1
氏名: C さん
身長: 171.6
体重: 64.3
氏名: D さん
身長: 168.5
体重: 55.2
氏名: E さん
身長: 162.1
体重: 61.4
CSV ファイルを Table オブジェクトとして読み込むためには loadTable 関数を使用します。
loadTable の第 1 引数は読み込むファイルのファイル名です。
ファイルの 1 行目をヘッダーとして使用するためには、第 2 引数に文字列 "header" を渡します。
Table オブジェクトの主要なメソッドを紹介します。
getRowCount は、表の行数を返すメソッドです。
getRow は、整数型の引数 i を受け取り、表の i 行目の Row オブジェクトを返します。
次にRow オブジェクトから列のフィールドを取り出すための方法を紹介します。
フィールドを文字列として取り出すためにはgetString 、整数として取り出すためには getInt 、実数として取り出すためには getFloat を使用します。
それらのメソッドは、1 つの引数 j を受け取り、表の i 行目のj列目のデータをそれぞれの型で読み込みます。
table.csv は、1 列目が氏名、2 列目が身長 、3 列目が体重というヘッダーを持っていました。
getString, getInt, getFloat はそれぞれ、列数の整数ではなく、ヘッダーの列名を渡すことができます。
以下のプログラムは上記と同等の処理になります。
Table table = loadTable("table.csv", "header");
for (int i = 0; i < table.getRowCount(); ++i) {
TableRow row = table.getRow(i);
println("氏名: " + row.getString("氏名"));
println("身長: " + row.getFloat("身長"));
println("体重: " + row.getFloat("体重"));
println();
}
getRow で Row オブジェクトを取得しなくても、Table オブジェクトの getString, getInt, getFloat の第 1 引数に取得する行の番号を渡すことで 直接欲しい行の欲しい列を取得することができます。
Table table = loadTable("table.csv", "header");
for (int i = 0; i < table.getRowCount(); ++i) {
println("氏名: " + table.getString(i, 0));
println("身長: " + table.getFloat(i, 1));
println("体重: " + table.getFloat(i, 2));
println();
}
Table オブジェクトの getString, getInt, getFloat の第 2 引数には、列名を渡すこともできます。
Table table = loadTable("table.csv", "header");
for (int i = 0; i < table.getRowCount(); ++i) {
println("氏名: " + table.getString(i, "氏名"));
println("身長: " + table.getFloat(i, "身長"));
println("体重: " + table.getFloat(i, "体重"));
println();
}