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列は必ずブランクになる など)について。
データ内容の話なので、上記までの項目より細かな仕様項目になる。
初期段階でここまで検討する必要はないかもしれないが、最終的には必要になってくる。
初期段階でも、列数などおおよその見通しはたった方が良い。
上記「ファイル容量(サイズ)」「件数」の検討で試算を行う場合、計算材料として必要になってくる。