Java で CSV ファイルを読み込むときには、テキストファイルを読み込むときと同様に BufferedReader を使用します。ここでは、CSV ファイルの読み込み方法について説明します。
CSV ファイルを読み込む
今回は以下のような CSV ファイル(sample.csv)を読み込んでみます。
1 2 |
item_00,item_01 item_10,item_11 |
以下は 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 |
import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; class Sample { public static void main(String args[]) { try { File f = new File("sample.csv"); BufferedReader br = new BufferedReader(new FileReader(f)); String line; // 1行ずつCSVファイルを読み込む while ((line = br.readLine()) != null) { String[] data = line.split(",", 0); // 行をカンマ区切りで配列に変換 for (String elem : data) { System.out.println(elem); } } br.close(); } catch (IOException e) { System.out.println(e); } } } |
実行結果
1 2 3 4 |
item_00 item_01 item_10 item_11 |
上のプログラムでは、まず BufferedReader と FileReader を使用してファイル全体を読み込んでいます。readLine() で読み込んだファイルの文字列を一行ずつ取得し、split() で配列に分割しています。
split() は第1引数に区切り文字を指定しています。split() で「item_00,item_01」の文字列を分割し、{ item_00, item_01 } のような形で配列に格納しています。そして、このプログラムでは行を読み込むごとにデータを表示しています。String.split() の詳しい使い方については「Javaで文字列を分割する:split()」を参照してください。
ファイルを扱うときの注意点ですが、try catch を使用して必ず IOException の例外を補足する必要があります。また、ファイルの読み込みが終了したら忘れずに close() を呼び出しましょう。
データを配列に格納する
読み込んだ CSV のデータを扱いやすくするために、一度配列に格納する場合がよくあります。
以下は配列に CSV データを2次元配列に格納するサンプルです。
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 |
import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; class Sample { public static void main(String args[]) { try { File f = new File("sample.csv"); BufferedReader br = new BufferedReader(new FileReader(f)); String[][] data = new String[2][2]; String line = br.readLine(); for (int row = 0; line != null; row++) { data[row] = line.split(",", 0); line = br.readLine(); } br.close(); // CSVから読み込んだ配列の中身を表示 for(int row = 0; row < data.length; row++) { for(int col = 0; col < data.length; col++) { System.out.println(data[row][col]); } } } catch (IOException e) { System.out.println(e); } } } |
実行結果
1 2 3 4 |
item_00 item_01 item_10 item_11 |
上の例では、読み込んだデータを一度2次元配列に格納し、その配列からデータを取り出して表示しています。もし読み込むデータの行や列の個数がわからないときは、配列ではなく ArrayList を使用しても良いでしょう。
文字コードを指定して読み込む
CSV ファイルを読み込むと文字コードによっては、文字化けが発生してしまう可能性があります。そのようなときは InputStreamReader と FileInputStream を使用して、適当な文字コードを指定してあげると、文字化けせずに読み込める場合があります。
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 |
import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; import java.io.IOException; class Sample { public static void main(String args[]) { try { File f = new File("sample.csv"); InputStreamReader osr = new InputStreamReader(new FileInputStream(f), "SJIS"); BufferedReader br = new BufferedReader(osr); String line; // 1行ずつCSVファイルを読み込む while ((line = br.readLine()) != null) { String[] data = line.split(",", 0); // 行をカンマ区切りで配列に変換 for (String elem : data) { System.out.println(elem); } } br.close(); } catch (IOException e) { System.out.println(e); } } } |
上のプログラムでは、InputStreamReader の第2引数に SJIS の文字コードを指定して読みこんでいます。