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();
}