CSVで「3列のはずなのに4列になる」「途中の行からずれる」という症状が出たら、最初に見るのは値の中のカンマ、ダブルクォート、改行だ。
カンマを含む値
3列のCSVで、値そのものにカンマを含めたい場合、そのフィールドを適切に引用する必要がある。引用されていないカンマは、新しい列の区切りとして解釈されることがある。
ダブルクォートを含む値
引用されたフィールド内でダブルクォート自体を表現する場合、一般的なCSV規則では二重化して扱う。
引用符が途中で閉じていないCSVは、後続のカンマや改行まで同じフィールドだと解釈され、複数行を巻き込むことがある。
セル内改行
備考欄や住所欄には改行が入ることがある。セル内改行を含む値は、引用符で正しく囲まれていれば1フィールドとして扱えるCSVも多い。
しかし行単位で単純分割する処理では壊れる。CSVは「1行ずつ文字列分割すれば読める」とは限らない。
一部の行だけ列数が違うとき
- ヘッダーの列数を数える
- 壊れている最初の行を特定する
- その行のカンマを確認する
- 引用符が対になっているか確認する
- 直前の行から引用状態が続いていないか確認する
- CSVパーサーで再読込する
「壊れた行」ではなく、その前の行の閉じ忘れが原因の場合もある。
手でカンマを消す前に
値の中に必要なカンマがあるなら、それを削除するのはデータ改変になる。構造エラーなのか、値そのものなのかを切り分ける。
大量CSVを正規表現や単純な文字列分割だけで検査すると、引用されたカンマや改行を誤判定しやすい。CSVの引用ルールを理解するパーサーで読み、ヘッダーと各レコードの列数を比較する。
関連: CSVインポート前チェックリスト
壊れ方を試すための無料サンプルCSVも公開している。
列ずれを直すときは、最初に壊れたレコードと、その直前の引用状態を見るのが近道だ。