CSVと向き合う日々
ITの世界で仕事をしていると、今は減ったかもしれませんが、CSVファイルに向き合うとこがあります。
向き合うとしても、色々なケースがあります。
一番多いのは「とりあえずCSVファイルでください」ですかね?
ただ、この「CSVファイルで」というのは罠が多く、多くのエンジニアが苦しめられてきました。
その苦しめられてきた、CSVファイルの話を歴史を織り交ぜて語ります。
CSVファイルとは?
そもそも、CSVファイルというのは何でしょうか?
RFC4180には「Comma-Separated Values (CSV) Files」と記載してあり、カンマ文字で区切った物と記されています。
そこには7つのルールが記載されています。
- Each record is located on a separate line, delimited by a line break (CRLF).
- 各レコードは、改行 (CRLF) で区切られた個別の行に配置されます。
- The last record in the file may or may not have an ending line break.
- ファイルの最後のレコードは、改行があってもなくてもよい。
- There maybe an optional header line appearing as the first line of the file with the same format as normal record lines.
- オプションで、通常のレコード行と同じフォーマットで、ファイルの最初の行としてヘッダー行が表示される場合もある。
- Within the header and each record, there may be one or more fields, separated by commas.
- ヘッダーと各レコード内には、カンマで区切られた 1 つ以上のフィールドが存在する場合があります。
- Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all).
- 各フィールドは二重引用符で囲んでも囲まなくてもよい(ただし、Microsoft Excelなど、二重引用符をまったく使わないプログラムもある)。
- Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.
- 改行(CRLF)、二重引用符、カンマを含むフィールドは二重引用符で囲む。
- If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote.
- 二重引用符でフィールドを囲む場合、フィールド内に現れた二重引用符は、その前に別の二重引用符を付けてエスケープしなければならない。
意外とルールが決められているという印象とともに、決められていないルールも多々あることに気付くでしょう。
これが、多くのエンジニアが苦しめられてきた原因であります。
苦しめられてきた3戦
「とりあえずCSVファイルでください」
当初は、データを渡すときにCSVファイルで渡せば、何とかなると思っていました。
しかし、これが罠だったのです。
CSVファイル自体には細かいルールが無いのですが、読み込む側にはルールがあるのです。
そんな苦しめられてきたルールを語っていきます。
行制限
最初に苦しめらたのは行制限です。
Excel 2003以前のバージョンは、ファイルの拡張子が.xlsだけでした。
そうなのです、Excel 2003までExcelは最大行数が65,535行です。
つまり、ちょっとしたデータでも、当時はExcelでは扱えなかったのです。
実際にCSVファイルを渡した先から「毎日もらうデータが同じ行数なのは何故?」と言われてことあります。
いやいやいや、そんなことないわー!と思いCSVファイルを確認すると、平均10万行だったので「何を使って確認してます?」と聞くとExcelだったというオチでした。
Excelを直せという人も居ましたが、大抵はファイルを分割するという一手間をかけることになりました。
5,000行ごと1ファイルにするなんて、今は行わない処理ですね。
改行コード
次に苦しめらたのは改行コードです。
RFC4180には「Each record is located on a separate line, delimited by a line break (CRLF).」と記載がありますが、RFC4180が決まる前からCSVファイルを使っていた人としては、改行コードは環境依存というケースが多々有りました。
つまり、UNIX環境ではLFで、Windows環境ではCRLFです。
ちなみに、Macというか当時のMacintoshは漢字Talkなので改行コードはCRでした。
実行されていた環境はUNIX環境だったので必然的にLFになるのですが、残念なことに当時のWindowsでは改行コードがLFだと読めないことが多かった。
そもそも、当時のExcelは改行コードがLFだと読み込めませんでした。
もう、しょうがないのでCRLFで出力していました。
出力時に\r\nと記載していたもんです。
なお、逆のパターンもありましたが、そこは正規表現で何とかなるので大した問題じゃなかったです。
しかし!
時を隔てて、改行コードはGitで…
それは、またの機会に話したいと思います。
文字コード
最後に苦しめらたのは文字コードです。
今こそ、文字コードはUTF‐8一択ですし、それ以外を選ぶケースは無いと思います。
CSVファイルの文字コードをUTF‐8で作って、またしてもExcelなのですが、Excelで読み込むと文字化けします。
そう、今もCSVファイルの読み込みはShift JISです。
この場合の対処方法は2つあります。
- エディターで開いてコピペする
- TSV(Tab-Separated Values)ファイルにする
手間ですけど、エディターで開いてコピペするのは確実です。
ただ、当時は大きなサイズだと、開ききれないことが多かったので、TSVファイルにすることが多かったです。
また、TSVファイルはcutコマンドやmysqlimportをするときには非常に親和性が高く、一時期はCSVファイルよりTSVファイルでやり取りをしていることが多かったです。
結局のところ
行制限も、改行コードも、文字コードも、すべてはExcelが読めるために必死に調整していたのです。
CSVファイルの戦いは、Excelとの戦いだったと言っても過言ではありません。
CSVファイルと私の20年は、実はExcelとの戦いだったのです。
タイトルの元ネタ
「部屋とYシャツと私」です。
平松愛理さんの曲で、同曲を原案とした映画もありますが、曲の方が有名になり結果として、CDが90万枚以上売れました。
1993年に映画公開されているのですが、残念ながらサブスクリプションでの配信は一切ありません。
大昔に、レンタルビデオで見たことありますが、サブスクリプションなら見ても良いかなって感じです。