先頭の0が消える、1-2 が1月2日になる、16桁の番号が丸まる。
ダブルクリックする前に、変わるセルを洗い出します。
CSVをExcelでダブルクリックして開くと、Excelは「数字に見えるもの」を数値に、「日付に見えるもの」を日付に変えてしまいます。会員番号の先頭の0、郵便番号、型番の「SEPT2」、16桁のカード番号。しかもそのまま上書き保存すると、変わったあとの値でCSVが書き戻されます。このツールは、日本語版のExcelで実測した規則でセルを1つずつ判定し、開いたときの見え方と、保存したときに書き戻される文字を並べます。ファイルの中身はどこにも送りません。
Excelで開いたときの見え方
変わるセルの一覧
| セル | 元の値 | Excelで開くと | 上書き保存すると | なぜ |
|---|
Excelの「データ」タブ →「テキストまたはCSVから」で読み込み、「データの変換」で番号や郵便番号の列の型をテキストにしてから読み込みます。これなら先頭の0も16桁の番号も残ります。文字コードもこの画面で選べます。
日本語を含むCSVをUTF-8で書き出すときは、先頭にBOMを付けます。付けないと、日本語版のExcelはShift_JISとして読んで文字化けします。
="00123" と書くとExcelでは0が残りますが、Excel以外のシステムで読むとそのまま ="00123" という文字になります。"00123" とクォートで囲むだけでは残りません。'00123 も CSVでは効かず、' ごと表示されます。
利用者が入力した文字をそのままCSVに書き出すと、= で始まる値が数式として実行されます(CSVインジェクション)。書き出すときに先頭へ ' を付ける、または該当する値を弾くなど、仕様で決めておきます。
CSVには「この列は文字」という情報がありません。だからExcelは、セルごとに中身を見て、数値や日付に読めるものを親切に変換します。人が手で入力するときには便利なこの動きが、システムから書き出した番号やコードには裏目に出ます。
厄介なのは、壊れたことに気づきにくいことです。0が消えた会員番号も、1月2日になったサイズ表記も、見た目はそれらしく並んでいます。そして「開いて、少し直して、上書き保存」をした瞬間に、CSVそのものが壊れた値で書き換わります。12桁以上の番号は 1.23457E+11 という文字で保存され、元には戻せません。
このツールの判定は、日本語版Excelで162通りの値を実際に開き、見え方・列の幅そのままの見え方・上書き保存で書き戻される文字を記録して作りました。161通りで一致しています。規則にない形の値は「文字のまま」と推定しています。文字化けそのものの原因調べは 文字化け再現ビューア、実例は CSVの先頭ゼロが消える に書いています。
文字化けの原因調べは 文字化け再現ビューア、CSVに入れる意地悪なテストデータは 意地悪テストデータ生成器、指定サイズのCSVファイルが欲しいときは ダミーファイル生成ツール をどうぞ。