CSVファイルの書式

汎用的なデータ形式としてよくCSVファイルを使用しています。よく使っている割には正しいフォーマットについて知らなかったので、調べたことをメモっておきます。

目次

  1. CSVファイルとは
  2. CSVの仕様
  3. Excelで読めることが大切ですよね
    1. ExcelからCSVファイルを書き出してみた
    2. CSVファイルをExcelで開いてみた

CSVファイルとは

CSVとはComma-Separated Valuesの省略形です。カンマでデータを区切ったデータ交換用のテキストファイルです。ウィキペディアに詳しい説明があります。

とても使いやすいフォーマットで、かなり古くから用いられていて、一般化してから仕様(RFC4180)ができました。ということでRFC4180の通りにしても読めないソフトウェアもあるようなのですが、これから作るものはRFC4180に併せておいた方が良いですよね。

CSVの仕様

RFC4180から、一部を引用します。

  1. Each record is located on a separate line, delimited by a line break (CRLF).
  2. The last record in the file may or may not have an ending line break.
  3. There maybe an optional header line appearing as the first line of the file with the same format as normal record lines. This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional "header" parameter of this MIME type).
  4. Within the header and each record, there may be one or more fields, separated by commas. Each line should contain the same number of fields throughout the file. Spaces are considered part of a field and should not be ignored. The last field in the record must not be followed by a comma.
  5. 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). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields.
  6. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.
  7. 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.

それぞれ意訳してみました。

  1. 1行あたり1レコードとする。行は改行コード(CRLF)で分けたものとする。
  2. ファイルの最終レコードの末尾には、改行が有っても無くても良い。
  3. ファイルの最初の行を、ヘッダにしても良い。ヘッダはフィールド名を記す役割とし、通常のレコードと同じ数のフィールドを持つこと。
  4. フィールドをカンマで区切ること。ファイル内の各行に、同じ数のフィールドがあること。フィールド内にスペースが含まれる場合があり、そのスペースを無視しないこと、レコードの最終フィールドの後ろには、カンマを付けなくても良い。
  5. 各フィールドは、ダブルクォーテーションで囲われる場合がある。もしフィールドがダブルクォーテーションで囲われていない場合は、フィールド内にはダブルクォーテーションが含まれないものとする。
  6. 改行(CRLF)、ダブルクォーテーション、カンマを含むフィールドは、ダブルクォーテーションで囲うこと。
  7. フィールドをダブルクォーテーションで囲う場合は、フィールド内のダブルクォーテーションの前にダブルクォーテーションを付け足してエスケープすること。

レコードの区切りは改行で、フィールドの区切りはカンマで、改行・カンマ・ダブルクォーテーションを含むフィールドはダブルクォーテーションで囲んで、フィールド内のダブルクォーテーションはエスケープする、というのは割とわかっていたのですが、下記の決まりがあるとは知りませんでした。

  • カンマと実データの間にスペースを入れた場合、そのスペースもデータの一部として扱われる
  • コメント行の定義は無い

Excelで読めることが大切ですよね

CSVファイルの受け渡しの相手がExcelというのは割とよくあるシチュエーションだと思いますので、ちょっと試してみました。

ExcelからCSVファイルを書き出してみた

まずはExcelからCSVファイルを書き出してみました。使用したExcelはExcel 2016です。

image0

ちょっとわかりにくいですが、「にほへと」の前と「ちりぬるを」の後ろにそれぞれスペースがあります。

これをCSV形式で保存して、テキストエディタで開いてみるとこのようになります。

文字列,数値,日付,カンマを含む,改行を含む,ダブルクォーテーションを含む
いろは,123,2017/1/1,"1,1","改行
改行",
 にほへと,456,2017/1/2,"2,2",,"a""b"
ちりぬるを ,789.012,2017/12/31,"3,3",,

スペースも出力してますね。

CSVファイルをExcelで開いてみた

上記で出力したCSVファイルをダブルクリックして、Excelで開いてみます。

image1

「にほへと」のセルの先頭と、「ちりぬるを」のセルの末尾に、それぞれスペースが付いています。ダブルクォーテーションのエスケープ部分も削除されてます。フィールド内の改行も反映されてますね。

上記の定義通りにCSVファイルを作れば、ExcelコンパチブルなCSVにできるということですね。

なお上記のCSVファイルの文字コードをUTF-8(BOM無し)に、改行コードをLFに変えた状態でExcelに読ませたところ、文字化けしました。Excelに読ませるなら、Windowsの作法にあわせて文字コードはシフトJISに、改行コードはCRLFにしましょう。

公開日