はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

Java でCSVファイルの入出力

JavaCSVファイルの入出力

JavaCSVファイルを入出力するラッパークラスを作ってみたのでメモ。

環境

CSVファイルの書き込み

書き込みには、PrintWriter クラスを使用。

参考:PrintWriter (Java Platform SE 8)

コンストラクタでは、とりあえず、ファイル名(String) と ファイル(File)に対応させた。

.print または.println の引数に、 CSVに書きたい値を渡すだけで書き込みできるようにした。

可変長引数にしているので以下のように書ける。


CSVPrintWriter csvpw = new CSVPrintWriter("test.csv");
csvpw.println(100, "Sato", 20);
csvpw.println(101, "Tanka", 30);

test.csv

100,Sato,20,
101,Tanka,30,


public class CSVPrintWriter {
  PrintWriter pw_;

  // Constructor
  public CSVPrintWriter(String fileName) {
      try {
          this.pw_ = new PrintWriter(fileName);
      } catch (FileNotFoundException fnex) {
          fnex.printStackTrace();
      }
  }

  public CSVPrintWriter(File file) {
      try {
          this.pw_ = new PrintWriter(file);
      } catch (FileNotFoundException fnex) {
          fnex.printStackTrace();
      }
  }

  public void print(Object arg) {
      synchronized (this.pw_) {
          this.pw_.print(arg);
          this.pw_.print(",");
      }
  }

  public void println(Object... args) {
      synchronized (this.pw_) {
          for (int i = 0; i < args.length; i++) {
              this.pw_.print(args[i]);
              this.pw_.print(",");
          }
          this.pw_.println();
      }
  }

}

CSVファイルの読み込み

読み込みには、Scanner クラスを使った。

参考リンク:Scanner (Java Platform SE 8)

コンストラクタは、File, String, InputStream に対応させた。

.readメソッドで、 CSVデータをArrayList<String[]> で返すようにした。 ArrayList のサイズはCSVデータの行数になり、 String[] のサイズは、カラム数になる。

Scanner の.nextLine()CSVの各行にアクセスする、 文字列で返ってくるので、.split(",") でカンマ区切りでString[]化している。


public class CSVScanner {
    Scanner scan_;

    // Constructor
    public CSVScanner(File source) {
        try {
            this.scan_ = new Scanner(source);
        } catch (FileNotFoundException fnex) {
            fnex.printStackTrace();
        }
    }

    public CSVScanner(String source) {
        this.scan_ = new Scanner(source);
    }

    public CSVScanner(InputStream source) {
        this.scan_ = new Scanner(source);
    }

    public ArrayList<String[]> read() {
        ArrayList<String[]> csv_list = new ArrayList<>();
        String[] line_str_arr;

        synchronized (this.scan_) {
            while (this.scan_.hasNext()) {
                line_str_arr = this.scan_.nextLine().split(",");
                csv_list.add(line_str_arr);
            }
        }
        return csv_list;
    }

}

サンプルコード

Java のPrintWriter とScanner を使ったCSVファイルの入出力(Readerと ...