CSVの列がずれるときは、カンマより引用符を見る
住所にカンマが入ったら列が増えた。メモ欄を改行したら別の行になった。CSVは表を文字で渡せる便利な形式ですが、区切り記号とセルの内容を見分ける約束が必要です。ファイルの書き方と、Excelが読み込んだ後に行う変換を分けると、原因を追いやすくなります。
セルの中のカンマは、セル全体を引用符で囲む
RFC 4180 §2が記述するCSVでは、カンマ・改行・二重引用符を含むフィールドを二重引用符で囲み、内側の二重引用符を二つ重ねます。このRFCは広く使われる形式を記録したInformational文書で、すべてのCSV実装を一律に拘束するInternet Standardではありません。
表の値をCSVにすると
引用符を閉じた直後に見栄えのための空白を足すと、受け手によっては不正なCSVになります。JSONのようにバックスラッシュで引用符を逃がす書き方も、このCSVの規則ではありません。
| セルに入れたい値 | CSVでの表記 |
|---|---|
| Osaka | Osaka |
| Osaka, Japan | "Osaka, Japan" |
| He said "yes" | "He said ""yes""" |
| 先頭と末尾の空白 | 空白もデータ。勝手にtrimしない |
画面上の行数と、CSVのレコード数は一致しない
引用符の内側にある改行は、一つのセルの内容です。単純に改行で分割してからカンマで分割する処理では、この境界を読めません。次の例は見出しを除いて2レコードで、A-1のnoteだけが2行あります。
引用符内の改行を含む入力
RFC 4180のレコード区切りはCRLFです。実際にはLFのファイルもあり、Online ToolsのCSV差分比較はCRLF・LF・CRを受け付けます。引用符内の改行は値として残るため、改行コードだけを変更したセルも差分になりえます。見た目だけを見て、値が同じと決めつけないのがコツです。
id,note
A-1,"first line
second line"
B-2,"He said ""yes"""
行が並び替わる一覧はID列で比べる
更新前後のCSVを行番号だけで比べると、並び替えに埋もれて価格や名称の変更を見落とします。CSV差分比較ではidなどの一意な列で同じレコードを対応付け、値は文字列のまま比べます。
順序が逆でもA-1の価格だけが変わる例
上側とafterより下側を別々の入力欄へ入れ、キー列名をidにすると、A-1のpriceが100から120へ変わった一件が出ます。区切りの--- after ---は説明用で、入力には含めません。このツールでは列順を無視しますが、両方の列名の集合は同じ必要があり、空・重複した列名やキーはエラーになります。
id,price
A-1,100
B-2,200
--- after ---
id,price
B-2,200
A-1,120
引用符で囲んでも、Excelの文字列指定にはならない
CSVに"00123"と書いても、二重引用符はCSVの境界を表す記号です。「この列を文字列として読む」という型の宣言ではありません。Excelが数値と判断すると、先頭ゼロを落としたり、長い番号を丸めたりすることがあります。
番号を保つには読み込み時の列型を選ぶ
Microsoftは、テキストの取り込みで列を文字列型にする方法を案内しています。対象版では自動データ変換の設定も使えます。元のCSVを残し、取り込み画面でID列を文字列にしてから読み込むと、変換の前後を比べられます。すでに丸めて保存された桁は、表示形式を変えるだけでは戻りません。Microsoftの先頭ゼロ・大きな数値の案内に版ごとの条件があります。
BOMは文字コードの手がかりで、列の型は守らない
UTF-8のCSVを開いて日本語だけが崩れるなら、引用符より文字コードの指定が先です。MicrosoftはBOM付きUTF-8の通常オープンと、BOMなしの場合のインポート手順を案内しています。BOMはCSVの列名・区切り文字・数値型を宣言するものではありません。
Online Toolsで作るCSVの特徴
JSONからCSVへの変換では、区切りをカンマにすると、必要なセルに引用符を付けてレコード間をCRLFにします。ダウンロードはUTF-8 BOM付きです。コピーしたテキストとダウンロードしたファイルは、BOMの有無まで同一ではありません。また、引用処理は表計算ソフトでの数式実行を防ぐ仕組みではないので、外部から来た値を取り込む運用では別途扱いを決めます。
同じ小さな表で、変換と比較を試す
CSV差分比較はカンマ区切り・先頭行が見出しのCSVに対応します。JSONを表へ出すならJSONからCSVへの変換へ。CSV差分は各入力50万文字・データ1万行・差分1万件までなので、巨大な一覧は対象を絞って比べます。
関連記事と仕様
形式選びはCSVとJSONなどの選び方、文字化けは文字コードの基礎へ。引用規則はRFC 4180 §2、文字コードの取り込みはMicrosoftのUTF-8 CSVの案内を参照できます。