アドレス帳や住所録などのデータ移行や、EXCELで集計・グラフ化するための生データなどでよく使われるCSV形式のファイル。
なんとなく使っているけど仕様がイマイチ理解できていないとか、時々うまく読み込めない事があるとかいうことはありませんか?
そういう方の為に、今回はCSVファイルの仕様について整理しておこうと思います。
CSVとはカンマで区切られたテキストファイル
CSVは Comma-Separated Values の頭文字を取った名前で、読んで字のごとく、項目がカンマで区切られたテキストファイルになります。
カンマの代わりにタブ文字で区切られる場合、「タブ区切りのCSV」という呼び方をされることがありますが、正式にはTSV(Tab-Separated Values)と呼ばれます。
CSVとTSVは区切り文字が異なるだけで仕様は同じです。
CSVファイルをEXCELで開くと、自動的に各列に分解されて表示されます。
仕様が曖昧になっている原因
CSVの仕様は、インターネット技術標準化を行うためのグループであるIETF(nternet Engineerng Task Force)が中心となり、RFC(Request for Comments)と呼ばれる文書で公開されています。
しかし、RFCで規定される以前からCSVというフォーマットが存在しており、それらを包括するよう仕様を取り決めていったため、結果的に曖昧な部分(方法が2つある場合、どちらを採用しても良いなど)が多くなっています。
CSVの仕様を紐解く
CSVは、1行目が項目名を現わすヘッダ部、2行目以降はデータを現わすボディ部(又はデータ部)にわかれます。
一般的な仕様は次の様になります。
チェック項目 | 仕様 | 補足 |
---|---|---|
ヘッダの有無 | ヘッダは有っても無くても良い | ヘッダが存在する場合、通常は先頭の1行ですが、作り手によって2行、3行のケースもあります。 |
項目数 | ヘッダを含む全体を通して、項目数は一定であること | ヘッダ及びデータの途中で項目数が変わることが無い様にします。 |
項目を囲むダブルクォーテーション | 各項目の前後はダブルクォーテーションで囲んでも、囲まなくても良い | 数値はダブルクォートで囲まず、文字列はダブルクォートで囲むというケースもあります。 |
項目にカンマや改行が含まれる場合 | カンマ、又は改行コードが含まれる項目はダブルクォーテーションで囲む | これは厳守です。これが守られないと、CSVの読み取り側は対応できなくなります。 |
項目内にダブルクォーテーションがある場合 | 項目内にダブルクォーテーションが含まれる場合は2つ重ねる | 「”」なら「””」という具合にダブルクォーテーションが2つ続くようにします。これは厳守です。 |
改行コード | 行末の改行コードは CR/LF、LFのどちらでも良い | Windowsの改行は CR/LF (2文字)、UNIXはLF(1文字)なので、どちらでも構いません。 読み取り側はどちらにも対応しておくのがベストです。 |
文字コード | 文字コードは特に規定なし | 仕様上特に規定はありませんが、SHIFT-JISかUTE-8が多く使われています。 |
ファイル終端 | ファイルの終端は、改行コードが有っても無くても良い | 最後に改行コードを入れるか入れないかは悩ましい問題ですが、CSVの仕様上どちらでもOKです。 |
こうして見ると、次の3つのルールを押さえておけば良さそうですね。
- 前後のダブルクォーテーションが有る場合は抹消する
- カンマ、改行コード、ダブルクォーテーションが含まれる項目はダブルクォーテーションで囲む
- 項目にダブルクォーテーションが含まれる場合、2個重ねる
EXCELでCSVを編集する時の注意点
CSVファイルを編集する場合、最も便利なのがEXCElです。
ただし、いつくか注意する点があります。
先頭の0が無条件に抹消される
これはEXCELの仕様によるものなのですが
「CSVを開いた際、EXCELが数字項目だと判断したデータにおいて、先頭の0は無条件に抹消される」
というものがあります。
金額や個数などの数字だと問題無いのですが、IDや製品やシリアル番号など、数字で構成されていて桁数が変わってはいけない項目は、このEXCELの仕様が働くと問題を引き起こすことが有ります。
具体的には、アプリケーションAの出力結果をアプリケーションBに引き渡す際、EXCELで開いて変更を加えた場合です。
本人は全く別の項目を修正しているにもかかわらず、保存したのちにアプリケーションBに読み込ませたら、エラーになったり、意図しない不具合が発生することになるので注意が必要です。
日付や時刻の0が抹消される
これもEXCELの仕様なのですが、
「CSVを開いた際、EXCELが日付/時刻項目だと判断したデータにおいて、月日の先頭0は無条件に抹消される」
というものがあります。
次の例では年月日の月と日の先頭0が消去されていますが、時分秒が有った場合も同様です。
例えば、 「2020/08/09 08:03:06」は 「2020/8/9 8:3:6」の
日付だけでなく、時分秒が含まれる場合はもっとひどくなります。
時間の先頭0が消えるのは日付と同様ですが、秒の桁が完全に欠落してしまいます。
そして、何故か分の桁だけは0が消されません。
これはCSVのデータに含まれる日付や時刻を処理するアプリケーションだと致命的なエラーになる場合があります。
日付は 「YYYY/MM/DD」や「YYYY/MM/DD HH:MM:SS」という具合に固定長で扱うアプリケーションが多いため、桁ずれを起こして読み込めない等のトラブルが発生する可能性があります。
対処方法としては、保存時にEXCELの「セルの書式設定」を使ってフォーマットを整えることです。
文字コード違いによる文字化け
アプリケーションAから出力したCSVをEXCELで開いたとき、漢字が全て文字化けしているということが時々あります。
これは、EXCELはSHIFT-JISでの読み書きが前提であるにもかからわず、アプリケーションAがUTF-8など、SHIFT-JIS以外でCSVを作成した場合によく起きます。
一番簡単な解決方法は、Windowsのメモ帳で開いて、保存する際に「ANSI」か「UTF-8(BOM付き)」のどちらかを選択して保存することで解決します。
まとめ
以上でCSVの説明を終わります。
「項目内にカンマ、改行、ダブルクォーテーションが含まれている場合、ダブルクォーテーションで両端を囲み、データ中のダブルクォーテーションは2連続になるようにする」
という部分が実質上の規定であり、それ以外(ヘッダ有無、項目の両端をダブルクォートで括る、文字コードなど)は自由です。
また、EXCELで編集するとデータの一部が欠落するという点についても解説致しました。
CSVはデータ連携でよく使うフォーマットなので、データ連系でCSVを使う上での参考になれば幸いです。
コメント