make is.dev make it simple. development.
2024年9月12日

CSVファイルの仕様項目

CSVファイルを読み書きする場合、ファイルの仕様を確認、検討する必要がある。
その際の確認、検討項目について。

CSVファイルとは

CSV(Comma Separated Values)は、名前の通りカンマで区切られたテキストデータのこと。
これが保存されたファイルがCSVファイルで、拡張子は .csv になる。

それ以上の定義はないので、CSVファイルと言っても色々なフォーマットやルールがある。
ただ、ある程度のパターンは決まっている。

RFC 4180に定義があるが、ここでも「CSVのさまざまな解釈を可能にする正式な仕様はありません。」と記載されている。

(参考)
https://tex2e.github.io/rfc-translater/html/rfc4180.html

基本の仕様項目

文字コード

文字コードは何か。
よく使われるのは、UTF-8や、Shift-JISなど。

UTF-8の場合は、BOMの有無も決めが必要。
システム間連携でよく使われるのはBOM無しだが、EXCELでUTF-8を扱う場合はBOM有りしか読み書き出来ないため用途によってはBOM有りを考慮する必要がある。

改行コード

改行コードが、LF、CRLF、CRのどれなのか。
システム間連携でよく使われるのはLFだが、EXCELのCSV保存はCRLFになるのでこちらも用途によってはCRLFを考慮する必要がある。
EXCELに関わらず、Windows環境で作られるCSVは意図しない限りCRLFが多い。

OSによって採用している文字コードが異なる為と思われる。

  • Windows : CRLF
  • MacOS : LF(昔はCR)
  • Unix / Linux : LF

囲み文字

各値を囲む文字が何か。また、囲む際のルールが何か。

囲む文字はダブルクォーテーション「”」が一般的。

囲むルールは基本的に以下のどれか。

  • 常に囲む
  • 値の中に特定の文字が存在する時だけ囲む
  • 囲まない(特定の文字が値に含まれないことが前提になる)

ここで言う「特定の文字」は、CSVデータの中で特別な意味を持つ文字を指す。
具体的には以下の3つ。

カンマ(区切り文字)
値の中にカンマがあると、区切りなのか、値の一部なのか、分からなくなる。
そのため、値を囲むことでその範囲内のカンマを値の一部として扱う。

囲み文字
値の中に囲み文字があると、囲みなのか、値の一部なのか、分からなくなる。
そのため、あえて囲んだ上で値内の囲み文字を区別可能な形に変換する。

改行
CSVファイルでは行末にも改行が入る。
そのため、値の中に改行があると、行末なのか、値の一部なのか、分からなくなる。
値を囲むことでその範囲内の改行を値の一部として扱う。

値内の囲み文字のルール

囲み文字を使う場合、値の中に含まれる囲み文字は区別可能な形に変換する。
その際の加工ルールが何か。

EXCELのCSV保存を例に挙げると、囲み文字はダブルクォーテーション「”」。
値内のダブルクォーテーション「”」は、「””」と2つ重ねる事で囲み文字と区別する。
(ファイルを読み取る際はこれを1文字の「”」として読み取る)

ファイル名のルール

必要に応じてファイル名のルールを決める必要がある。
主に自動連係を行う際など。

例)data_[yyyymmdd].csv(yyyymmddはデータ作成日)

ファイル容量(サイズ)

必要に応じて、ファイルの容量(サイズ)のルールを決める必要がある。
主に多量のデータを扱う際など。

基本的には上限を決めれば良い。

データの内容に関する仕様項目

まず、CSVファイルに格納するデータが以下のどちらなのかで大きく分かれる。

  • 表形式のデータ(データ1件=1行で、列毎に格納する値が決まっている)
  • それ以外

それ以外のものは如何様にもなってしまうので、用途に合わせて細かく確認・整理するしかない。

ここでは、パターンが決まっている表形式のデータについて記載する。

ヘッダ行

ヘッダ行の有無、及び、行数について。

例えば1行目をヘッダ行とする場合、実際のデータは2行目からとなる。
データを読み込む処理都合としては1行目を読み飛ばす手間がかかるが、視認性やデータのチェックを考えるとヘッダはあった方が扱いやすい。

件数

表形式の場合、値内に改行が入らない限りは件数=行数になる。
基本的には最大件数が決まれば良い。

前述の「ファイル容量(サイズ)」と同様に扱える上限を決めるものになるが、片方が決まるともう片方も計算から自動的に決まる事が多い。

場合によっては最小件数も検討が必要。
(例えば、0件のデータは正常なのか?異常なのか?など)

列毎のルールと列間の関連ルール

列毎に格納される値のルール(文字列 or 数値 or 選択肢 or 日時、必須かどうか、など)について。

また、列間の関連ルール(例えば、A列が1の時はB列は必ずブランクになる など)について。

データ内容の話なので、上記までの項目より細かな仕様項目になる。
初期段階でここまで検討する必要はないかもしれないが、最終的には必要になってくる。

初期段階でも、列数などおおよその見通しはたった方が良い。
上記「ファイル容量(サイズ)」「件数」の検討で試算を行う場合、計算材料として必要になってくる。