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

getRowRow オブジェクトを取得しなくても、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();
}

results matching ""

    No results matching ""