外部システムとの連携を考える際に、ファイルフォーマットをどうしましょうかという問題は常に存在する。
CSVのいいところ
だいたいみんな知ってる。エクセルでもつくれるし、エクセルでも見れる。
CSVの悪いところ
細かいところで仕様のブレが発生する。
- 全部にダブルクォートする?
- フィールド内改行を許す?
- 改行コードはCRLF?LF?
- 文字コードは、SJIS?UTF8?BOMつきUTF8?
一番やばいのが、フィールド内改行。エクセルはセル内改行をLFで表現するが、レコード区切りはCRLF。もはやテキストとしての体幹がグラグラ。UTF8のCSVをダブルクリックしてもエクセルでは文字化けしてしまう。BOMつきUTF8にすれば解決するが、そもそもCSVをダブルクリックしてエクセルで開いちゃうと、前ゼロは抜けちゃうしいいことない。エクセルで開いていただくつもりなら、最初からエクセルファイルをサーバー側で作るのがいいのかも。
XMLのいいところ
- ツリー構造が定義できる。
- メタデータ定義のパートとデータパートを1ファイルにまとめれる
- でかいファイルの場合もSAXパーサーを使えば省メモリで処理ができる
XMLの辛いところ
- CSVっぽいテーブルデータを定義するための共通仕様があるようでない。
- ファイル見ただけでは、何が配列で何がハッシュか分からない
JSONのいいところ
- どの言語でも作りやすい
- ファイル見ただけで構造がわかる
- 見慣れてる
JSONの悪いところ
- ファイル全部読まないとパースできない
- 1行ずつ完結するNDJSONも規格としては存在するが、NDJSONという単語がメジャーではない
- エクセルでファイルが作れない
まとめ「仕様を絞ったCSVが暫定一位」
CSVの仕様の幅が広いのは受け入れるしか無い。
「BOMなしUTF8のCSVでフィールド内改行はなしね」で大体はカバーできる。BOMなしUTF8はエクセルで開くのが一手間かかるが、そのひと手間をかけれる人だけがCSVを扱ってよし。フィールド内改行の取り扱いがうまくいかないのはエクセルでもそうなので、CSVを扱う限りはフィールド内改行は諦めた方がいい。(なにか別の文字で置換するルールでいい)。