30
2010

[Java]CSVライブラリの比較

CATEGORYJava
タイトルどおり、お仕事の環境がやっとまともにライブラリを使えるようになってきたので、CSVを処理するライブラリを調べてみた。
ググると似たような事をしてる人は結構居るけど、いまいち判断が付かなかったので、自分でまとめた内容を書いておく。

以下、公開時期が古いっぽい順に上から列挙。

名称最終リリースライセンス機能その他
CSVTokenizer & CSVLineVer 1.01
(1999/4/14)
記載なし?1行分のCSVを分解/出力。国産
S2Csv0.0.2-sp2
(2008/10/23)
Apacheライセンス2.0アノテーションでCSVとBeanをマッピング。
値の変換やバリデーションも指定可能。
国産、要Seasar2
blancoCsv1.2.3
(2010/4/2)
LGPL定義書からCSVを読み書きするソースを自動生成。国産
opencsv2.2
(2010/4/26)
Apacheライセンス2.0Reader/Writer的にString配列で入出力。
またはCSV→Beanのリストとして読み込み。
 
Commons CSVNightly Builds
(2007/8/23)
Apacheライセンス2.0未リリースのまま開発中断?
Super Csv1.52
(2008/9/9)
Apacheライセンス2.0Reader/Writer的にBeanやMap、Listに入出力。
マッピングは配列で使用時に宣言。値の変換も可能。
(高機能なので、もっと色々な使い方も可能?)
Spiffyというライブラリに依存あり。こちらもApacheライセンス2.0
OrangeSignal CSV1.3.0
(2010/2/25)
Apacheライセンス2.0アノテーションを含め色々な方法でCSVとBeanをマッピング可能。
フィルタリングやソートなども可能な模様。
(非常に多機能な模様、把握し切れていません(--;)
国産

※ 上記はこの記事を書いている2010年10月時点の内容です。

このうち、実際に使おうと試してみたのは「opencsv」と「Super Csv」、「OrangeSignal CSV」の三つ。
他は、情報収集の時点でいまいちピンと来なかったり、環境面で使えなかったりしたので、除外した。
他にもまだまだありそうだが、調べてて名前を見かけるのはこれぐらいかと思われる。
(その他、Commons LangStringEscapeUtilsにもCSV関係のメソッドがあるが、エスケープ/アンエスケープしか出来ないので問題外。)


で、使ってみた感覚としては・・・結論として「Super Csv」が一番使い勝手がよさそうだった。

いろいろと高機能ではあるらしいものの、単純にCSV→Mapのように読み込むだけであれば簡単なコードでさくっと書くことができる。
こういう使い方ができれば、多くの場合目的をカバーできると思う。
値の変換が必要になれば、その際改めて仕組みを追加することができそうなので、そういう点でも優秀と言えそう。

次点が「opencsv」。opencsvは非常にシンプル。
ただシンプル過ぎてString配列かBeanにするかの二択しかなく、Beanに変換しようとするとまとめてListでしか返してくれなかったりと、融通が利かず使いがたい。
Beanに変換しないと、結局String配列に添え字でアクセスせざる得なくなり、あまり幸せになれない。

その次が「OrangeSignal CSV」。多機能なのはいいが、逆に迷ってしまうと言うか・・・自分が欲しいものとは方向性が違う雰囲気。
おそらく用途にぴったりハマれば非常に使えるのだろうけど、そうでなければもっと簡単なものでいいやという気持ちを持ってしまうかも?
(国産で公式ドキュメントが日本語なのは、他二つに比べて大きなメリットではある。
ただ、うちの職場みたいに開発現場に外国人が居ると逆にデメリットにも・・・。)


以上、比較結果はこんな感じでした。
で、最後にちょっと言いたいことが・・・何故みんなバリデーションがないの!?
多くの場合、CSVってことは他システムやユーザーが作ったものを渡されるわけで、入力値チェックは必須だと思うのですが、みんな無さそうなのですよね・・・(涙
(見つけられてないだけだったらごめんなさい。)

いくらうちのライブラリはCSVからBeanに変換できます!と言われた所で、変換時にバリデーションが出来なければ使い物にならないわけで・・・。
そんなわけで自分のところでは、
CSV → Super CSVでMapに変換 → Mapにバリデーション → Beanに変換、等
というような流れで使っていく方針です。
これなら余分なBeanを作らなくて済むし、変換もBeanUtilsとか出来合いのものでカバーできるかなと。

・・・うん、実は除外したS2Csvが一番使えるんじゃないかという気がする。
アノテーションでマッピング出来る上に、バリデーションも使えるし・・・Seasar2を使っているならの話だが(汗


2013年11月5日追記
3年もたって今更ではありますが、OrangeSignalの方にこの記事に言及頂いていたことに気づきました。いずれのライブラリも、バリデーションとしては Bean Validation を使うことが想定されているということでした。

当時その設計思想に全然気づいていなかったと思います(汗 情報ありがとうございましたm(__)m
スポンサーサイト

Tag: Java

0 Comments

Leave a comment