レイモンドの異常な愛情 または私は如何にしてCSVフォーマットを止めて/etc/passwdフォーマットを愛するようになったか

 Joel SpolskyのBiculturalismには、"/etc/passwd is easier to parse than CSV"と書いてあるが、その理由を書いてある日本語の文章を読んだことが無い。The Art of Unix Programmingに載っている話なので、英語で良ければwebで読めるのだけれど。
 気になった(wikipedia等のデータを処理した後に使えるようなデータフォーマットはなにがいいかなと考えていた)ので読んで見たところ、デリミタに使われている文字列自体を使いたいときに、CSVだと文字列をダブルクォートで囲んでしまうけど、これは以下の点で良くない、という話だった。

  • パースがややこしい
    • 今文字列の中をパースしているのかどうかをフラグを立てて判断しなければならなくなる。
    • 常に文字列はクオートされるわけではないので、そこにもフラグが要る。
  • 上記のように仕様に曖昧性があるので、実装によって互換性の問題が出てくる。
    • 例えば、改行を含むような文字列を許すべきか?

 それに対し、/etc/passwdフォーマットは、デリミタとして:を使い、デリミタ自体を使いたいときには\でエスケープする、という仕様なので、曖昧性もあまりないし、パースもめんどうでない(escape characterが出てきた場合のみ特別な関数に飛べば良い。)
 まぁ、/etc/passwdフォーマットにも曖昧性は無くは無い(\nは改行でいいとして、\kとかは単にkとするべきなのか?それともエラーとしてはじくべき?)が、CSV形式と比べると、確かに曖昧さは少ない。
 個人的には、エスケープ文字が導入された時点で単純にstring-splitなどで処理できなくなるので、S式でread/writeしようよ、という方向に走りたくなる。実際、今作ってる研究用のソフトは、自分で書いた部分はS式で片付けている。(遅いので、公開前にはバイナリで読み書きするように書き換えるけど。)ただ、このやり方だとvalidatorを自分で書くのが面倒なので、そういうところまで考え出すと、結局XMLでアリモノを使うのが楽なのかなぁ、という気もしている。validatorを書くためにXMLを勉強するコストを考えると、本当のところはどちらが楽かはわからないけど。
 結局、XMLにあってS式にないのは、簡単にSchemaを書く方法なんじゃないか。そんな結論。