opencsv | Ouobpo

opencsv

 アプリケーション開発で、古典的だが必ずといっていいほど登場するのが、CSV(Comma Separated Values)ファイルの読み書きだ。単にデータ列をカンマ(,)で区切っただけの単純なデータ形式なのだが、RFCなどの正式な仕様がないせいか、CSVを扱う標準的なライブラリというものが存在しない(少なくともJavaでは)。

 (8/4追記: とおりすがりさんからコメント欄でご指摘いただいたが、CSVのRFCはあるそうだ。→ http://www.kasai.fm/wiki/rfc4180jp

 そのため、CSVを扱う要件が出てくるたびに独自のライブラリを作るという、車輪の再発明が至るところで行なわれている。しかし、このCSVは一見単純なのだが、データの中にカンマが入っている場合とか、データをダブルクォート(")で囲ってきた場合とか、データの中にダブルクォートがあってそれがエスケープされている場合とか、細かいところを厳密に考えだすと結構面倒くさい。

 再利用可能なCSVライブラリはいつ出てくるのだろうかとずっと思っていたのだが、先日opencsvというライブラリをSource Forgeで見つけた。
http://opencsv.sourceforge.net/

 CSVの読み書きに対応していて、まず読み込む場合は以下の通り。
CSVReader reader = new CSVReader(new FileReader("input.csv"));
try {
String[] line;
while ((line = reader.readNext()) != null) {
// 読み込んだCSVデータで何かをする
}
} finally {
reader.close();
}

 書き出す場合は以下の通り。
CSVWriter writer = new CSVWriter(new FileWriter("output.csv"));
try {
String[] data = ... // 書き出すCSVデータ
writer.writeNext(data);
} finally {
writer.close();
}

 使ってみた限り、ダブルクォートによるエスケープ処理にもきちんと対応しており、性能は十分実用に耐えるものになっていそうだ。

 Mavenを使っている方は、pom.xmlに以下のように書くだけですぐ導入できる。
[pom.xml]
<dependencies>
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>1.8</version>
</dependency>
</dependencies>

 これでついに、アプリケーション開発でCSVライブラリを書かなくてもいい日が来るのだろうか。