データ形式・構造化データ
CSVの列がずれる。引用符と改行を確認したい
使うツール
一覧では二列のはずなのに、取り込むと三列になる。あるレコードだけ次の行へはみ出す。そんなCSVを見つけても、最初から余分なカンマや改行を削除しないでください。住所や備考の一部として必要な文字かもしれません。CSVでは、同じカンマでも『列を区切る記号』なのか『値に含まれる文字』なのかが、周囲の引用符によって変わります。
CSV確認・編集の表プレビューと、JSON⇔CSVの変換を使い、文字列がどのセルへ入ったかを確かめます。ここで扱うのはUTF-8の小さな架空データです。文字化けしている場合は区切りの問題と分け、先に文字コードを確認します。見た目を整えるために値そのものを変えるのではなく、正しい境界で読めているかを調べましょう。
住所のカンマを、一つのセルへ収める
id,address
001,North, Building Aヘッダーはidとaddressの二列ですが、データ行にはカンマが二つあります。区切りをカンマとして実行すると、列数が合わない入力として確認できます。Building Aを第三列へ移すのが正解とは限りません。住所全体がNorth, Building Aという一つの値なら、その値を二重引用符で囲むのがこの例の修正です。入力仕様を確かめず、余った列を黙って捨てないでください。
id,address
001,"North, Building A"修正後の表では、idに001、addressにNorth, Building Aが入ることを見ます。引用符は通常セルの値そのものには含まれません。JSON⇔CSVへ同じ入力を渡すと、idが文字列の001で残ることも確認できます。このツールで先頭ゼロが残っていても、別の表計算ソフトが数値へ自動変換する可能性はあります。次の受け渡し先でも列の型を確かめます。
三行に見えても、一件のデータかもしれない
id,note
001,"first line
second line"この入力はヘッダー一件と、データ一件です。noteの二重引用符が次の物理行まで続いているため、first lineとsecond lineは同じセルへ入ります。表プレビューで備考が一つのセルに収まることを確認し、JSONへ変換した場合は改行が文字列内のエスケープ表記になることを見ます。ソースの行数とデータ件数を同じものとして数えないのがポイントです。
ここで行の整理ツールで空行や重複行を削除すると、備考の一部を消してしまう可能性があります。CSVのレコード操作が目的なら、CSVとして解析した後の表や列の操作を使います。ログの一行一覧で有効だった方法を、そのまま引用符付きCSVへ持ち込まないでください。改行を含む値が許されない受け取り先なら、置換方法を事前に決め、値が変わることを明示する必要があります。
引用符を表示したいときは、引用符を二つ並べる
id,name
001,"Notebook ""mini"""表のnameにNotebook "mini"と表示されれば、この例は意図どおりです。外側の引用符はセルの境界、内側の二つ続く引用符は値に含まれる一つの引用符です。JSONで使うバックスラッシュによる表記をそのままCSVへ移すと、別の文字列として読まれたり解析に失敗したりします。形式ごとに境界のルールが違うので、元の値と出力形式を分けて考えます。
すべての値を引用符で囲む設定を使うと、単純な値にも引用符が付くため出力の見た目は変わります。しかし、再読込後のセル値が同じなら、引用方法だけの変更です。元の文字列と出力文字列が完全一致しないことを、すぐにデータ損失と判断しないでください。逆に見た目が似ていても、備考に含まれた引用符が消えていれば値が変わっています。比較するのは解析後の値です。
一列に固まったら、区切り設定を疑う
id;amount
001;12.50この入力をカンマ区切りで読むと、ヘッダーのid;amount全体が一つの列名になり得ます。区切りをセミコロンへ変更して、idとamountに分かれるかを見ます。一列に読めたことは成功の証明ではありません。列数が想定どおりか、列名が一致するか、先頭と末尾のレコードが同じ形で読めるかまで確認します。区切り設定を変える前に、値の中の文字を一括置換する必要はありません。
本ツールの列選択や再出力では、選んだ区切りで入力を解釈します。入力の区切りと出力の区切りを独立に切り替える専用変換があるものとしては扱わず、まず現在の設定で正しく読めるかを確かめます。別形式へ渡すなら、JSONへの変換を挟んで値を確認する方法もあります。小数点がカンマの地域のデータでは、数値の表記と列の区切りを混同しないことが特に重要です。
空欄・ゼロ・数式らしい文字列も確認する
空欄のセルと、0を入力したセルは同じではありません。またCSVだけでは、空文字とJSONのnullの意味を十分に区別できない場合があります。変換結果の空欄をすべて0へ変えると、未回答だった項目が『数値ゼロ』に変わってしまいます。値の意味を決めるのは入力元と受け取り側の契約です。引用符を整える作業のついでに、未指定だった型や欠損の意味を勝手に決めないようにします。
表計算ソフトへ渡すときは、=などで始まる文字列が式として解釈されないかも確認します。式注入対策を有効にすると、対象の値に接頭辞を付けるため、元の値と同じではなくなります。人が表で読む出力と、プログラムが元の文字列を受け取る出力を区別してください。引用符で囲むことだけを、あらゆる表計算ソフトに対する式実行防止策とは考えないでください。
最後に、住所のカンマ、備考の改行、名前の引用符、先頭ゼロを持つIDを、一つずつ試験用の小さなCSVへ残します。正しいレコード数とセル値を書いておけば、出力元を更新した後も同じ条件で確認できます。問題のある本番ファイルを丸ごと共有する前に、架空の二、三件で同じ列ずれを再現できるかを試すと、原因と共有範囲の両方を小さくできます。