Develop with pleasure!

福岡でCloudとかBlockchainとか。

CSVパーサー

CSVファイルを扱うことは多いが、オープンソースCSVのパーサーって中々メジャーになっていない。まぁ、String#split辺りで簡単にすませちゃってたりしてるから?
一応、Apacheでもcommons-csvなるものがあるが、まだsandboxだ。

他にも、
・Open CSV
http://opencsv.sourceforge.net/
・Genjava CSV
http://www.osjava.org/genjava/multiproject/gj-csv/
・Skife CSV
http://kasparov.skife.org/csv/
・Super CSV
http://supercsv.sourceforge.net/

といったパーサーがある。中でもSuper CSVは、CSVファイルを読み込み、1行の内容をStringのリストやMapで返してくれる他に、JavaBeansにマッピングもしてくれる。他にも、読み込み、書き出しの際に、値を任意のデータ型に変換してくれる。他と比べると結構機能が充実してそうなので今回はSuper CSVを使ってみた。

まずは、CSVの一行のデータをマッピングするJavaBeansを作成。

public class HogeLog {

    public static final String[] HEADER = new String[]{"名前", "住所"}
    private String name;

    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

HEADERという変数はCSVのヘッダ情報を定義した変数。で、SuperCSVでCSVファイルを処理するには、

ICsvBeanReader csv = new CsvBeanReader(new FileReader(file), CsvPreference.STANDARD_PREFERENCE);
try{
    HogeLog log;
    while ((log= csv.read(HogeLog.class, HogeLog.HEADER)) != null) {
       // 変数logに値がマッピングされている
    }
}
finally{
    csv.close();
}

といった感じ。もし、CSVファイルの一行目にヘッダ情報が付いている場合は、
String[] HEADER = csv.getCSVHeader(true);
といったコードでヘッダ情報が取得可能。他にもCSVから読み込んだデータをマッピングする際にデータを文字列→日付等に変換させることも可能。

シンプルで便利♪