CSVをExcelで開くと「001」が「1」になる — 0落ち・文字化けの根本原因と、事故らない開き方
自治体のシステム、ECの管理画面、会計ソフト。どこから落としたCSVでも、Excelでダブルクリックした瞬間に同じ事故が起きます。商品コードの「001」が「1」に変わり、枝番の「1-1」が「1月1日」になり、日本語が「譁�蟄�」という記号交じりの列に化ける。自分も職場の基幹システムから出力した名簿やコード表のCSVで、これを何度も踏みました。検索すると対症療法の記事はいくらでも見つかりますが、「なぜ起きるのか」から説明したものは意外と少ない。この記事では、0落ち・日付化け・文字化けが同じ根から生えていることをCSVというフォーマットの構造から説明し、そのうえで事故らない開き方を3通り比較します。根本を一度理解すれば、現象ごとの対処法を場当たりで覚える必要はなくなります。
毎週どこかの事務で起きている定番事故
まず現象を並べます。ダブルクリックでCSVを開くと、先頭に0が付いたコード(001、0120 など)は0が消えます。ハイフンやスラッシュ入りの値(1-1、3/4)は日付に変わります。長い数字の列は「1.23457E+15」のような指数表記になり、桁が丸められることもあります。そして文字コードが合わないと、日本語全体が読めない記号の列になります。厄介なのは、この状態のまま上書き保存して先方に送り返してしまう二次事故が後を絶たないことです。0落ちしたコード表は突合作業を静かに壊し、気づくのはたいてい数日後です。
根本原因は3つ — 型がない、推論する、宣言がない
第一に、CSVというフォーマットには型情報がありません。CSVは区切り文字で区切られたただのテキストで、「この列は文字列」「この列は数値」という宣言を書く場所がどこにもありません。「001」が商品コードなのか数値の1なのか、ファイル自身は何も知らないのです。
第二に、Excelはダブルクリックで開くとき、型を勝手に推論します。型情報がない以上、何かで補うしかなく、Excelは「数値に見えるものは数値、日付に見えるものは日付」と解釈します。「001」は数値の1と解釈されて先頭の0が捨てられ、「1-1」は1月1日と解釈されます。多くの場面では便利に働く親切設計ですが、コード・電話番号・枝番に対しては破壊的に働きます。しかも変換はセルの値そのものに及ぶため、上書き保存した時点で元の情報は失われます。
第三に、文字コードはファイル内に宣言されません。HTMLにはcharsetという宣言がありますが、CSVにはそれに当たるものがありません。ファイルは単なるバイト列で、UTF-8で書かれたのかShift_JISで書かれたのかを示す情報は、原則としてファイルの中に存在しないのです。唯一の例外がBOM(byte order mark)で、UTF-8のファイルの先頭にEF BB BFという3バイトの目印を付ける慣行があります。これが付いていればExcelはUTF-8として読んでくれますが、あくまで慣行であり、付いていないファイルも多い。BOMのないファイルを開く側は推測するしかなく、日本語環境のExcelは通常、Shift_JIS(正確にはcp932)とみなして読みます。UTF-8で保存された「文字」という2文字(バイト列ではE6 96 87 E5 AD 97)をShift_JISとして解釈すると、「譁�蟄�」という別物になります。逆にShift_JISのファイルをUTF-8前提のツールで読むと、今度は「�」の並びになります。
3つの事故は同じ根から生えている
こうして並べると、0落ちと日付化けは「型がない × Excelが推論する」の組み合わせ、文字化けは「宣言がない × Excelが推論する」の組み合わせだと分かります。三者は別々の不具合ではなく、「CSVが情報を持っていないので、Excelが善意で推論し、その推論が外れた」という一つの事故の三つの顔です。だから対処も現象ごとに覚える必要はなく、「Excelに推論させず、こちらから型と文字コードを与える」という一つの原則に還元できます。後述の3通りの開き方は、どれもこの原則の実装です。
「ダブルクリックしないで」は定着しない
自分は業務で、基幹システムから出力した名簿やコード表のCSVを日常的に扱います。原因を理解してからは自分では事故らなくなりましたが、次の壁は同僚でした。「CSVはダブルクリックせず、データタブから取り込んでください」と何度説明しても、ウィザードの手順は定着せず、結局ダブルクリックに戻ってしまう。責められません。月に数回しか使わない手順は忘れるのが自然で、覚えることが多い解決策は広まらないのです。もっとも、後述のどの開き方も「ダブルクリックしない」という反射の置き換えを要求する点では同じです。違いがあるとすれば伝え方で、ウィザードの手順は事前に暗記してもらうしかありませんが、URLなら事故が起きたその瞬間に「ここに放り込んで」と一行で渡せます。記憶に頼る解決策と、必要な瞬間に転送できる解決策の差です。後述の3つ目の選択肢を自作したのはこの読みからですが、同僚の反射を実際に変えられるかは、まだ検証の途中です。
事故らない開き方 3通り
この推論の破壊性は、Microsoft自身も認めています。2023年以降のExcel(Microsoft 365系のビルド)には「ファイル > オプション > データ > 自動データ変換」という設定が追加され、先頭の0を削除する変換や、長い数字を指数表記にする変換をオフにできるようになりました。CSVやテキストファイルの読み込みで変換が起きたときに警告を表示させることもできます。自分の端末でオフにしておく価値は十分あります。ただし、この設定は端末ごとに各自で変えるしかなく、同僚に配ることはできません。「1-1」が日付に変わる強制変換や、文字コードの推測も対象外のままです。設定だけでは事故は消えない——だからこそ、「Excelに推論させず、こちらから型と文字コードを与える」という原則に立った開き方が要ります。
1つ目は、テキストファイルウィザード(レガシー取込)です。列ごとにデータ形式を「文字列」に指定して取り込めば、0落ちも日付化けも起きません。取り込み時に文字コードも選べます。単発の取り込みなら十分な方法です。弱点は、最近のExcelでは既定で無効化されており、オプションの「データ」からレガシーデータインポートウィザードを有効にする必要があること、そして毎回ウィザードを通る手間がかかることです。
2つ目は、Power Query(データタブ→「テキストまたはCSVから」)です。取り込みダイアログで文字コード(「元のファイル」)を指定でき、「データ型検出」を「データ型を検出しない」にすれば全列が文字列のまま入ります。同じレイアウトのCSVを毎月受け取るような定常業務では、一度クエリを組めば次回以降は更新操作だけで取り込めるのが強みです。弱点は最初に操作を覚えるコストで、「ちょっと中身を確認したいだけ」の単発用途には大げさです。
3つ目は、ブラウザ完結の変換ツールに放り込む方法です。文字コードと区切り文字を自動判定し、全列を文字列として安全なxlsxに変換するタイプのものなら、ウィザードの手順を覚えずに済みます。自分は事故防止用に簡単な変換ツールを一つ自作して使っています(無料・ブラウザ内処理で、ファイルはどこにも送信されません)。弱点は、変換されるのは値だけで書式・数式・マクロは保持されないこと、そして大きなファイルには向かないことです。
使い分けは、単発の取り込みならウィザード、同じ形式の定常取込ならPower Query、同僚にも配れる最少手順が要るならブラウザツール、と考えています。どれを選んでも「Excelに推論させない」という原則は同じです。
CSVを受け取るたびの定常フローに
受け取ったCSVはダブルクリックせず、まず安全な経路でxlsxにしてから開く。この一手を毎回のフローに組み込んでしまえば、0落ちも文字化けも「起きてから直す」ものではなくなります。自分の場合は、届いたCSVをいったん変換ツールに通してから開く流れに落ち着いています。経路はウィザードでもPower Queryでも構いません。同じ「ファイルを外に出さない」発想の道具として、シートごとの分割・結合用のExcel シート分割・結合ツールと、ページ整理用のPDF 結合・分割ツールも置いています。
時間を、ゆっくりに。 — longdrift