JavaでCSVファイルの読み込みを行う

Java で CSV ファイルを読み込むときには、テキストファイルを読み込むときと同様に BufferedReader を使用します。ここでは、CSV ファイルの読み込み方法について説明します。

CSV ファイルを読み込む

今回は以下のような CSV ファイル(sample.csv)を読み込んでみます。

item_00,item_01
item_10,item_11

以下は CSV ファイルを読み込み、読み込んだデータを表示するサンプルです。

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

実行結果

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次元配列に格納するサンプルです。

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

実行結果

item_00
item_01
item_10
item_11

上の例では、読み込んだデータを一度2次元配列に格納し、その配列からデータを取り出して表示しています。もし読み込むデータの行や列の個数がわからないときは、配列ではなく ArrayList を使用しても良いでしょう。

文字コードを指定して読み込む

CSV ファイルを読み込むと文字コードによっては、文字化けが発生してしまう可能性があります。そのようなときは InputStreamReader と FileInputStream を使用して、適当な文字コードを指定してあげると、文字化けせずに読み込める場合があります。

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 の文字コードを指定して読みこんでいます。


イベント