ゆるテックノート

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の案内を参照できます。