目次を開く
CSVの列が途中からずれたとき、よくある原因の一つが値そのものに含まれるカンマです。CSVではカンマが列境界なので、住所や説明文のカンマをそのまま書くと次の列として解釈されます。
カンマを含むフィールドを引用符で囲む
RFC 4180では、カンマを含むフィールドは二重引用符で囲う形が示されています。
name,address,note
Sato,"Sapporo, Hokkaido","call after 18:00"
"Sapporo, Hokkaido" は1フィールドです。引用符がなければ2列として読まれる可能性があります。
全セルを囲う必要はない
カンマや改行、引用符を含むセルだけ囲っても成立します。ただし出力ツールごとに統一形式を使った方が差分確認は簡単です。
手で置換するよりCSVライブラリを使う
プログラムでCSVを生成するなら、自前で join(",") するより標準のCSVライブラリを使う方が安全です。ライブラリに引用規則を任せ、出力後に数行をテキストで確認します。
列数不一致や引用符崩れの事前検査には、CSV Preflightを使えます。
本番投入前の最終チェック
カンマを含む代表値を抽出して、前後の引用符が揃っているか確認します。CSVパーサーで読み直し、全行の列数がヘッダーと一致することを確認してから投入します。
- 値内カンマを含む行を確認した
- 引用符を閉じた
- パーサーで再読込した
- 列数を比較した
- 元CSVを残した
文字としてカンマが見えるかではなく、パーサーが1フィールドとして読めるかで判定します。
修正後は値そのものも照合する
列数が揃っただけで完了にすると、引用処理の途中でカンマや空白を削ってしまった事故を見逃します。修正前の代表値と再読込後の値を文字列で比較し、住所・タグ・説明文が同じ内容のまま1フィールドとして復元されることまで確認します。行数と列数に加えて値の一致をREADBACKへ含めると、安全に本番へ戻せます。