CSVファイルにはRFC4180という標準仕様があるのですが、やや広い定義となっています。 「RFC4180にしたがったCSVでやりましょう」だけではフォーマットが決まらないので、決めるポイントとおすすめ設定を紹介します。

SJIS?UTF8?(おすすめはUTF8)

RFC4180では、「基本はASCII!エンコード変えたかったらレスポンスヘッダで言って!」と言っていますので、ファイル単体でのやり取りに関しては「エンコードは決まってない」です。

おすすめエンコードはUTF8です。機械がテキスト処理をするのはUTF8エンコードが大半です。ただし人間がCSVを読む時にはエクセルを使うことが多く、UTF8をエクセルで読むにはひと手間必要です。そのひと手間が次に紹介するBOMありにするという手法です。

BOMあり?なし?(初取引の人へはBOMありがおすすめ)

UTF8で作られたCSVもBOMをつけることで、CSVファイルをダブルクリックしてもエクセルがUTF8として認識します。あくまで受け手がPC上でCSVをダブルクリックした時の利便性向上です。機械が読み取る時には関係ありません。もしくは機械はBOMが入ることを想定してない処理系もあります。「非エンジニアにとってはBOMがあることは意識しないでいい、エンジニアはBOMがあるということを伝えておけば伝わる」のでBOMありがおすすめです。

ちなみにBOMつきUTF8のことを、Kintoneでは「エクセルで読めるUTF8」と表現していました。とても分かりやすいですね。

改行コードはCRLF(おすすめはCRLFだけどLFでもあり)

RFC4180に従えば改行コードはCRLFです。CRLFにしておけば間違いはありません。ただLF改行でも通ってしまう処理系は非常に多いです。Linuxの処理系はもちろんのこと、LF改行のCSVファイルをWindows上でダブルクリックしてもエクセルは正しく認識します。

カンマ区切り?タブ区切り?(おすすめはカンマ区切り)

CSVという時点でカンマ区切りなんですが、タブ区切りを要求されるケースはあります。フィールド内にタブが入るケースは稀なので読み取り処理がシンプルです。ただしタブ区切りファイルをダブルクリックしてエクセルが読んでくれるかというとそうでもなく、非エンジニアには読み書きが扱いにくいでしょう。カンマ区切りが無難です。

フィルド囲みは必須?(必須がおすすめ)

RFC4180では「各フィールドは、それぞれダブルクォーテーションで囲んでも囲わなくてもよい。改行(CRLF)、ダブルクォーテーション、カンマを含むフィールドは、ダブルクォーテーションで囲むべきである。」とあるのですが、常にダブルクォーテーションで囲んでおいた方がいいです。多くのCSV作成ライブラリでは必要な時だけクォーテーションで囲まれるのですが、一部のサンプルをみただけでは「本当にこの人はいざという時に囲ってくれるんでしょうね」という不安があります。常に囲むのがロジックもシンプルですし、受け手も安心です。

フィールド内改行あり?なし?(なしがおすすめ)

RFC4180ではダブルクォーテーションで囲んでいれば改行を含んでも構わないことになっています。フィールド内改行がはいったCSVをダブルクリックすればエクセルは開かれますが、エクセルの「クエリと接続機能」で取り込むとフィールド内改行は失われます。エクセルでさえもフィールド内改行の対応は不完全です。Amazon Athena や GoogleBigQueryなどの、CSVを分析するツールもフィールド内改行が含まれたCSVは取り込めません。

つまりRFCでは「あり」とされているけど、実装上は対応されてないケースがあるので、フィールド内改行はないのがおすすめです。ただし、元データに改行がある場合には改行を取り除くとデータが変わっちゃうので、勝手に取り除くことはできません。「フィールド内改行はナシね、もし元データに改行があったら取り除くね」とCSVを受け取る人と合意が必要です。

フィールド内改行を取り除いてしまうと、複数行がつながってしまうので、別の文字に置換をするケースもあります。その場合空白などに置き換えれば見た目も違和感はないでしょう。本当の空白と「元改行だった空白」を区別したい時には、EMSPなどの普段使いしないような空白文字に置き換える処理などで乗り切っています。

置換処理が入るので、データベースの標準機能として備わってるCSV出力機能だけでは足りません。「全フィールドのフィールド内改行を別の文字に置換するプログラム」を挟む必要があります。ひと手間かかりますが、そのひと手間で後続処理はとてもスムーズに流れます。

ダブルクォーテーションのエスケープはダブルクォーテーションで(必須)

RFC4180にしがたってフィールド内にダブルクォーテーションが現れた時にはダブルクォーテーションを二重にすることでエスケープします。RFC4180にも必須とされていますしエクセルのデフォルトの動作でもあるのですが、SequelProのCSVエクスポートのデフォルトはバックスラッシュでエスケープします。これはどちらかというとエンジニアが気を配るところです。

以下チェックポイント

  • エンコードはBOMつきUTF8
  • すべてのフィールドをダブルクォーテーションで囲む
  • ダブルクォーテーションはダブルクォーテーションでエスケープ
  • フィールド内改行無しにしませんか?という合意

おまけ「CSVをダブルクリックで開くという行為」について

BOMつきUTF8にすることによって、CSVファイルをダブルクリックすることでエクセルで見やすくなるというメリットはありますが、各フィールドの型を一切指定することなく開いてしまうので、前ゼロが取れてしまったり、指数表記に変換されてしまったりします。そこでデータを更新されてしまうと別物のデータになってしまうので要注意です。エクセルはCSVビューワとしてのみ使いましょう。

Pocket