ravelll の日記

よしなに

RFC4180 を読んだ

CSV についての RFC である RFC4180 を読んだのでメモ。

導入

  • CSV が広く普及したあとでも正式なドキュメントは作られてこなかった
  • TSV については専用の MIME type がある(text/tab-separated-values)けど、CSV は作られてこなかった
  • この RFCCSV のフォーマットについてまとめたものであり、RFC 2048 に従って text/csv MIME type を登録するものである
    • RFC 2048 は IANA に MIME type を登録する際の手続きがまとめられている

CSV フォーマットの定義

  • CSV フォーマットの定義や実装はいくつかの種類があり、公式の定義は存在しない
    • ここではだいたいの実装で認められている定義をリストする
  • 1行目に値のフィールド名を示すヘッダーを付けても良い
    • ヘッダーの有無は MIME type の header パラメーターに present もしくは absent と示す必要がある
  • スペースはフィールドと見なし、無視されてはならない
  • 最後のフィールドの末尾にはコンマがあってはならない
  • それぞれの値はダブルクオートで囲んでも良いし、囲まなくても良い
  • 改行(CRLF)、ダブルクオート、コンマが値に入る場合は、ダブルクオートで囲む必要がある
    • 特に、ダブルクオートが入る場合は更にダブルクオートによってエスケープする必要がある
    • “ を値に含めたいときは ”“ となる
  • US-ASCII charset での使用が一般的だが、IANA の text ツリーで定義されているその他の文字セットが charset パラメータで指定されて利用されることもある
  • ABNF で CSV のフォーマットを表すと以下のようになる
file = [header CRLF] record *(CRLF record) [CRLF]
header = name *(COMMA name)
record = field *(COMMA field)
name = field
field = (escaped / non-escaped)
escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
non-escaped = *TEXTDATA
COMMA = %x2C
CR = %x0D ;as per section 6.1 of RFC 2234 [2]
DQUOTE =  %x22 ;as per section 6.1 of RFC 2234 [2]
LF = %x0A ;as per section 6.1 of RFC 2234 [2]
CRLF = CR LF ;as per section 6.1 of RFC 2234 [2]
TEXTDATA =  %x20-21 / %x23-2B / %x2D-7E