mygems

ExcelでCSVのデータが勝手に変わるのを防ぐ方法

ExcelはCSVを開くだけで先頭の0を消し、IDを1.23E+15、コードを日付に変えます。何も変えずに取り込む方法を紹介します。

執筆: mygems ·

CSVをダブルクリックすると、Excelが「気を利かせて」くれます。郵便番号 01234 は 1234 になります。注文番号 4012888888881881 は 4.01289E+15 になり、最後の桁は0に置き換わります。商品コード 3-5 は5月3日になります。こうした変更はどれもファイルの中にはありません。Excelが開くときに行ったもので、保存するとそのまま確定してしまいます。

対処法は、毎回開き方を変えて運に任せることではありません。Excelに推測させないようにすれば済み、1分ほどで終わります。

結論

  • CSVをダブルクリックしない。 データ → テキストまたはCSVから を使い、壊れやすい列を読み込む前に テキスト に設定します。
  • Microsoft 365では、 ファイル → オプション → データ → データの自動変換 で、不要な変換をオフにします。
  • ダブルクリックで開いたあとは、元のファイルに上書き保存しない。 被害はその時点でファイルに書き込まれます。
  • Googleスプレッドシート: ファイル → インポート で、テキストを数値、日付、数式に変換する のチェックを外します。

Excelが何を変えるのか、その理由

CSVには型がなく、すべての値が文字列です。Excelは数値や日付を扱いたいので、列ごと、セルごとに推測します。困る推測は次のとおりです。

元の値Excelの表示何が起きたか
012341234「数値」の先頭の0が削除された
40128888888818814.01289E+15指数表記になり、15桁目より後ろは 0 になる
3-5、1/25-Mar、2-Jan日付として読み込まれた
MARCH1、SEPT21-Mar、2-Sep日付として読み込まれた(遺伝子名で有名な問題)
1E5100000指数表記として読み込まれた
=1+12数式として読み込まれた
TRUETRUE(論理値として)たいていは無害。名前だった場合を除く

このうち2つは見た目だけでなく、元に戻せない破壊 です。16桁の数値が指数表記になると、最後の桁が失われます。Excelは数値を有効桁数15桁で保存するためです。また、日付として読み込まれた値は日付のシリアル値として保存されます。書式を文字列に戻しても、3-5 ではなく 46086 のようなシリアル値が表示されます。

重要なのは保存の瞬間です。 CSVを開いて変わるのは表示だけです。CSVとして保存すると、表示されている内容がファイルに書き戻され、元の値は失われます。

対処法1: 開かずにインポートする

2016以降のExcelデスクトップ版ならどれでも使えます。

  1. 空のブックを開きます。
  2. データ → テキストまたはCSVから で、ファイルを選びます。
  3. プレビューで データの変換(「読み込み」ではありません)をクリックします。
  4. Power Queryで、壊れやすい列(ID、郵便番号、電話番号、商品コード、口座番号など)をそれぞれ選びます。続いて 変換 → データ型 → テキスト を選びます。確認が出たら 現在のものを置換 を選びます。
  5. 閉じて読み込む をクリックします。

値は書かれたとおりに読み込まれます。本当に数値の列では計算もできます。推測をオフにしたのは、困る列だけだからです。

従来のウィザードを使いたい場合は、ファイル → オプション → データ → 従来のデータ インポート ウィザードの表示 → テキストから(レガシ) を選びます。すると データ → データの取得 → レガシ ウィザード に表示され、ウィザードの手順3で列を「文字列」に指定できます。

対処法2: 自動変換をオフにする

最近のMicrosoft 365版Excelには、まさにこのための設定があります。ファイル → オプション → データ → データの自動変換 にあります。

  • 先頭のゼロを削除して数値に変換する
  • 長い数値の先頭15桁を保持し、指数表記で表示する
  • 文字「E」を囲む数字を指数表記の数値に変換する
  • 連続する英数字を日付に変換する

困るものだけチェックを外してください。CSVを開くときにExcelが何かを変換したら通知する、というオプションもあります。これはオンのままにしておく価値があります。気づかない変更が、目に見える変更に変わるからです。

この設定はダブルクリックで開く場合にも効くので、いちばん手軽な方法です。ただし、持ち運びにはいちばん向きません。ファイルを送った相手には、その人自身の設定があるからです。

対処法3: Googleスプレッドシートと Numbers

Googleスプレッドシート も、初期設定では変換します。ファイル → インポート → アップロード を使い、インポートのダイアログで テキストを数値、日付、数式に変換する のチェックを外してください。すべてが書かれたとおりの文字列として読み込まれます。

MacとiPhoneの Numbers も、先頭の0を削除し、日付らしい値を日付として読み込みます。列を選んで書式を テキスト にすると、新しく入力する値には効きますが、開いた時点の変換はすでに済んでいます。データが大事な場合は、元のファイルと既知の値をいくつか突き合わせてください。

賢そうに見えて役に立たない方法

  • CSV内の値を ="01234" の形で書く。 Excelでは 01234 と表示されます。しかし、そのファイルを読むほかのツールからは数式に見えますし、書き出し先の次のシステムでも同じです。
  • アポストロフィを付けて '01234 とする。 同じ問題です。Excel以外のあらゆる場所で、アポストロフィがデータの一部になります。
  • 開いたあとで列の書式をテキストにする。 手遅れです。0はすでに消えていて、書式を変えても戻りません。

スマートフォンの場合

スマートフォンでも同じ問題が起き、しかも設定項目は少なめです。iPhoneのNumbers、SheetsやExcelのアプリは、どれも開くときに変換します。そこから保存し直したCSVには、変更がそのまま残ります。

すべてのセルを文字列として扱うCSVアプリなら、変換しないのでこの問題は起きません。Smart CSV Viewerでは、列に数値、通貨、日付が入っていると指定して、正しく並べ替えやフィルタをかけることもできます。ただし、型が変えるのは列の表示だけです。ファイル内の文字列はそのままです。

「予算」列を通貨表示の数値に設定した「列の型」シート。ファイルの文字列は変わらないという注記つき
変換ではなく、表示のための型
CSV File Viewer - Smart CSViPhone・iPad · Android

列を数値、通貨、日付として表示しても、中身は書き換えません。先頭の0、長いID、コードがファイルのとおりに残ります。

できること

身につけておきたい習慣

CSVを表計算ソフトで開いて保存し直す前に、壊れやすい3つの値を確認してください。先頭に0があるID、ファイル内でいちばん長い数値、日付に見えるコードです。この3つが無事なら、残りもほぼ間違いなく無事です。CSVとXLSXの比較ガイドでは、Excelに限らずどの表計算ソフトでもこれが起きる理由を説明しています。

よくある質問

ExcelでCSVの先頭のゼロが消えないようにするには?
CSVをダブルクリックで開かないでください。データ → テキストまたはCSVから を選び、データの変換をクリックして、対象の列をテキストに設定してから読み込みます。Microsoft 365では、ファイル → オプション → データ → データの自動変換 で「先頭のゼロを削除して数値に変換する」のチェックを外すこともできます。
Excelで長い数値が1.23E+15になるのはなぜ?
Excelは数値を有効桁数15桁で保存し、長い数値を指数表記で表示します。15桁目より後ろは0に置き換わるため、16桁のIDは保存すると元に戻せない形で変わってしまいます。すべての桁を残すには、その列をテキストとしてインポートしてください。
ExcelでCSVの数値が日付に変わるのを防ぐには?
データ → テキストまたはCSVから でファイルをインポートし、その列をテキストに設定します。Microsoft 365なら、データの自動変換の設定で「連続する英数字を日付に変換する」のチェックを外してもかまいません。あとから書式を変えても、値はすでに日付として保存されているため効果がありません。
CSVを保存したあとで、先頭のゼロを元に戻せますか?
保存したファイルからは戻せません。ゼロはもうファイルにないからです。値の桁数が決まっているなら、TEXT(A2, "00000") のような数式で0を埋め直せますが、確実なのは元のシステムから書き出し直して、正しくインポートすることです。
Googleスプレッドシートも、CSVのデータを変えますか?
はい、初期設定では変わります。ファイル → インポート を使い、「テキストを数値、日付、数式に変換する」のチェックを外すと、すべての値が文字列のまま残ります。

mygems — CSV EditorとSmart CSV Viewerを開発。大きなファイルで表計算ソフトが音を上げるから生まれた2つのアプリです。