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から読み込んだデータをマッピングする際にデータを文字列→日付等に変換させることも可能。
シンプルで便利♪