CSVTokenizer & CSVLine をリリースして10年

僕は1999年2月23日に、「CSVTokenizer & CSVLine」というソフトウェアをリリースした。つい先日、丸十年を迎えたということになる。

この「CSVTokenizer & CSVLine」は、Java言語でCSV(Comma Separated Value)を扱うためのクラスである。もともと、(今は懐かしい)JavaHouse-Brewersで田村健人氏が公開されていたものに、当時僕が欲しかった機能を追加したものだ。

実は今でも多少は使われていて、さきほど大学のアクセスログを調べてみたら、きょうも6件ダウンロードされているし、利用者の方からは月に数件は問い合わせを頂いている。僕も大学教員になって事務作業をすることはかなり減ったが、今でもときどき使っている。十年前に手がけたソフトウェアが今でも使われているというのは、ちょっと感慨深い。

当時はCSVに明確な仕様は存在していなかったのだが、いまはRFCが登場した。

このRFC4180をきちんとサポートできるように、「CSVTokenizer & CSVLine」を書き換えたいと思っているのだが、実は大きな問題がある。RFCにも出てくるように

"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx

このようなCSVファイルがあった場合、ダブルクォーテーションで囲まれている部分は、たとえ改行が含まれていてもひとつのフィールドと認識されなければならない。この例だと、1行目末尾のbからはじまるフィールドは、改行記号を挟んで"bb"に続くのだ。つまり

"aaa","b<改行>bb","ccc"

ということになる。

ところが、こうしたCSVファイルは「CSVTokenizer & CSVLine」では扱えない。「CSVTokenizer & CSVLine」は完全な行指向である。つまり、1行のデータが1つのレコードと対応する、古式ゆかしきUnix的な世界を前提にしているのだ。

そのため、RFC4180のCSVをきちんと取り扱おうと思ったら、行指向によらないクラス設計をしなければならない。つまり、新たなクラスを設計するということになる。

...ということをやりたいのだけど、まだ手がついていない。

ちなみに、Jakarta Commonsから「Commons CSV」というのが出ています。まだSandboxですが、たぶん問題ないでしょう。僕はまだきちんと試していません。