30秒で診断する:ファイルは壊れていない、Excelの推測が間違っている
コードの先頭の0が消えたときに最初に確かめるべきことは、データが壊れたのか、それとも読み間違えられただけなのかです。この2つでは対処法がまったく違い、間違った対処をすると、表示だけの問題が本当のデータ損失に変わってしまうことがあります。30秒でできる確認方法を紹介します。同じファイルをプレーンなテキストエディターで開いてください。Windowsならメモ帳、Macならプレーンテキストモードのテキストエディットです。そこでコードに0がすべて付いたまま表示されれば、00123、02138、07477のように見えれば、データは無事で、Excelの表示だけが間違っています。ディスク上のファイルには正しい文字が入っており、Excelがファイルを開いたときに意味を変えてしまったのです。これが最もよくあるケースで、このガイドのすべての対処法はここから始まります。
2つ目の手がかりは、どの値が変わったかです。普通の単語や短い数値、句読点は問題なく見えるのに、先頭の0を持つコードだけが0を失い、長いIDだけが末尾の桁を失い、大きな数値だけが指数表示になっているなら、それは区切り文字の問題でも破損でもなく、型の推測です。区切り文字の問題なら行全体が1列にまとまります。破損なら全体が文字化けしたり行が欠けたりします。型の推測は外科手術のように正確で、数値に見える値だけを変え、それ以外には一切手を付けません。00123が123になり、02138が2138になり、16桁のIDの末尾が元になかった0に変わっているなら、Excelはテキストを数値として扱ったのです。これで原因と対処法の両方が分かります。
3つ目の確認で、救出がまだ可能かどうかが決まります。テキストエディターでも0を除いた値しか表示されない場合、そのコピーのファイル自体が、変換後に再保存されてしまっており、0がそのコピーからは消えている可能性があります。まだ慌てないでください。そして何より、元のファイルをもう一度上書き保存しないでください。後半の救出の節では、まさにこのケースを扱います。桁が本当に取り戻せなくなるのは1つの場合だけです。長いIDが15桁に切り捨てられた場合、失われた桁はそのコピーからは消えており、元のデータからしか作り直せません。確認が済むまでは、元のファイルには手を付けず、コピーで作業し、変換されたファイルを良いファイルに上書き保存することは決してしないでください。
なぜExcelは推測するのか:CSVファイルには型の情報がない
この問題が繰り返し起きる理由を理解するには、CSVという形式について1つの事実を知る必要があります。CSVファイルはプレーンなテキストで、どの値が数値で、どれがテキストで、どれが日付かを示す見出しが付いていません。表計算ファイルはセルの型を一緒に持ちます。CSVファイルは型も書式も持ちません。あるのは文字とカンマと改行だけです。プログラムが開くとき、プログラムは各値の意味を自分で決めなければならず、プログラムによって決め方が違います。GoogleスプレッドシートやPythonは、指示がない限りCSVの値をテキストのまま保持するため、同じファイルがそちらでは正しく見えます。Excelは、CSVファイルをダブルクリックで開くと推測します。数値に見えるものは数値になり、日付に見えるものは日付になり、その推測が正しかったかどうかは確認しません。
その推測こそが問題の全体です。数値には、定義上、先頭の0がありません。数値の123とコードの00123は同じ数値ですが、同じコードではありません。郵便番号やSKU、従業員ID、電話の市外局番は数量ではなく、数字でできたラベルです。先頭の0は、単語の中の文字とまったく同じように、ラベルの一部です。Excelはそれを知りません。数字を見ると数値のルールを当てはめ、0を捨てます。本物の数値にとって0は情報を持たないからです。同じ理屈で2つ目の被害も説明できます。Excelの数値は有効数字15桁までしか保持しないため、16桁以上のIDは余った桁が0に置き換わります。ファイルは変わっていません。読み手が文字の意味を変えたのです。
この問題がJSONから変換したファイルでよく起きる理由もここにあります。JSONは型を区別します。文字列の00123と数値の123は別の値で、JSONからCSVへの変換では文字列が文字00123として書き出されます。変換は正しいのです。開き方が合っていないのです。このページのコンバーターを例にすると、コードの00123と00456、郵便番号の02138と07477、18桁の注文IDを含むサンプルで実行したところ、すべての値がCSVにバイト単位でそのまま出力され、引用符の小細工も桁落ちもありませんでした。食い違いが変換の手順ではなく開く手順にあると分かれば、直す場所も分かります。次の節で示すように、Excelが推測する前の取り込みの段階で直すのです。
推測がデータを壊す3つのパターンと見分け方
型の推測は3つの異なる方法でデータを壊します。見分けることが大切なのは、そのうち一部しか修復できないからです。1つ目は先頭の0が消えることです。00123が123になり、02138が2138になります。残った桁は正しいのですが、コードとしては間違っています。0を失った郵便番号は別の場所を指し、0を失ったSKUは倉庫のシステムと一致せず、短くなったコードはバーコードリーダーに拒否されることがあります。2つ目は精度の切り捨てです。15桁を超えるIDは末尾を失います。16桁の口座ID、1234567890123456は1234567890123450になり、1.23457E+15と表示されます。末尾の桁は隠れているのではなく0に置き換わっており、IDは別のレコードを指すか、どのレコードも指さなくなります。
3つ目はもっと分かりにくく、問題を直したつもりの人を引っ掛けます。指数表示は、データ損失のように見えて、まだそうではない場合があります。15桁の制限の中に収まる値なら、1.23E+15と表示されていても、裏側ではすべての桁が残っていることがあり、列幅を広げたり書式を変えたりすれば再び表示されます。ただし、値が15桁を超えている場合、その表示は正直です。桁は本当に消えています。確認方法は数式バーです。セルをクリックして、セルの表示ではなく数式バーを読んでください。数式バーに完全な値が表示されれば、直す必要があるのは表示だけです。数式バーに切り捨てられた値が表示されれば、データ自体が変わっており、救出の節でしか助けられません。コードやIDについては、セルの表示だけを信じてはいけません。
下のコードブロックは、このページの実際のコンバーターを3行のサンプルで実行して得た、正確な出力です。CSVの出力はすべてのコードについてJSONの入力とバイト単位で一致しており、コンバーターが原因ではないことが証明されています。右側の列は、同じ値をダブルクリックで開いたときにExcelがどう表示するかで、このガイドが直す対象の動作です。パターンに注目してください。コンバーターは保持し、Excelは推測し、桁はすべて推測のところで失われています。
CSV file (from this page converter, verified):\nsku,zip,name,orderId\n00123,02138,Widget A,\n00456,07477,Widget B,\n00078,,Widget C,123456789012345678\n\nWhat Excel shows on double-click:\nsku -> 123, 456, 78 (leading zeros dropped)\nzip -> 2138, 7477 (leading zeros dropped)\norderId -> 1.23457E+17, stored as 123456789012345000 (last 3 digits replaced with zeros)この表が証明していることに注目してください。ファイルからは何も欠けておらず、Excelの表示からはすべて欠けています。だからこそ取り込みによる修正がこれほど完全に効くのです。読み込む前に列をテキスト形式だとExcelに伝えれば、Excelは同じ文字を一切変換せずに保存し、すべてのコードは編集も検索と置換もデータ入力もなしに元の姿に戻ります。あなたのファイルがこのパターンに当てはまるなら、通説を否定する節は飛ばして、取り込みによる修正に直接進んでください。あなたのファイルは壊れていません。読み間違えられているだけです。
効かない4つの対処法と、なぜ試され続けるのか
効く対処法の前に、効かない4つの対処法を片付けておく価値があります。それぞれが時間を無駄にし、そのうち1つは事態を悪化させるからです。1つ目はCSVの中で値を引用符で囲むことです。00123を引用符付きで書けば0が守られる、と多くのガイドが主張しています。Excelではそうなりません。Excelは取り込みのときに引用符を取り除き、中の値に同じ数値の推測を当てはめるため、引用符付きの00123は引用符なしの00123とまったく同じように123になります。引用符が制御するのは、値の中のカンマの扱い方であって、Excelが値に付ける型ではありません。コードを守るために引用符で囲むコンバーターを売り込まれたとしたら、引用符が守っているのはカンマであって0ではありません。
2つ目は、ファイルを開いたあとで列をテキスト形式に書式設定することです。これは今後の入力の扱い方を変えますが、Excelがファイルを読み込んだときにすでに捨てられた桁を戻すことはできません。0は読み込みの時点で捨てられており、書式設定では、もうそこにない文字を作り出すことはできません。3つ目はユーザー設定の書式00000で、表示を5桁にそろえる方法です。これは表示だけの対処で、桁が残っている場合の固定長のコードにしか使えません。123は00123と表示されますが、保存されている値は今も123なので、書き出しでは123が出力され、実際のコードとの照合は失敗します。さらに悪いことに、可変長のコードでは気付かずに失敗します。6桁のコードを5桁にそろえても変わらず、4桁のコードを5桁にそろえると、元になかった0が1つ増えてしまうからです。
4つ目はアポストロフィの小技で、コードの前にアポストロフィを付けて入力する方法です。手で入力する値には効きます。アポストロフィが、その入力をテキストとして保存するようExcelに伝えるからです。CSVの取り込みには効きません。アポストロフィがファイルの内容の一部になってしまい、アポストロフィで始まるテキスト値として取り込まれ、照合も書き出しも壊れるからです。アポストロフィは手入力の値に残しておき、ファイルには取り込みによる修正を使ってください。どの対処法が失敗するかを知っておけば、最もよくある罠を避けられます。表示が正しく見えるから問題が解決したと思い込みながら、保存されている値は今も間違っている、という罠です。
対処法1:取り込みでコード列をテキスト形式にする
これが最初に試すべき対処法です。システムもファイルも何も変えず、区切り文字や文字コードが何であれ、どんなCSVにも使えるからです。ファイルをダブルクリックするのではなく、まずExcelを開き、ガイド付きの取り込みでファイルを取り込み、各列の型を自分で選びます。取り込みダイアログのプレビューですぐに正しく選べたかどうかが分かります。プレビューでコードに0が付いて表示されれば、シート上でもそのまま表示されます。プレビューで0が除かれたままなら、まだ何も変更していないので、読み込む前に列の型を調整できます。
- Excelで空白のブックを開きます。CSVファイルをダブルクリックしてはいけません。
- データ、テキストまたはCSVからと進み、ファイルを選択します。
- プレビューダイアログで区切り文字とファイルの文字コードを確認し、読み込みではなくデータの変換をクリックして、Power Queryエディターを開きます。
- Power Queryエディターで、自動で追加された型の変更のステップを見つけて削除します。そのステップこそが数値の推測を行う場所です。
- 郵便番号、SKU、ID、電話の市外局番など、すべてのコード列を選択し、データ型をテキストに設定します。
- 閉じて読み込むをクリックします。コードはテキストとして届き、先頭の0もすべての桁もそのまま残ります。
これを救出の手段としてだけでなく、CSVファイルを開くときの既定の方法にしてください。ダブルクリックは、区切り文字と文字コードとすべての列の型についての推測です。取り込みは、その3つすべてについての選択で、かかる時間は1分ほど長いだけです。Macでも同じ手順が使えます。データ、テキストからと進み、取り込みの手順で列の型を設定します。Pythonのcsvモジュールのように、CSVをプレーンなテキストとして読むツールは決して推測しません。だからこそ、スクリプトでは0が見えてExcelでは見えないファイルは、ファイルが問題なくExcelが推測を間違えたのだと診断できるのです。その違い自体が診断になります。
対処法2:Excelの自動データ変換をオフにする(Microsoft 365とExcel 2024)
CSVファイルを毎日開くなら、そのたびに取り込むのは面倒で、長く使える対処法は、Excelが既定で何を推測するかを変えることです。最近のExcel、Microsoft 365とExcel 2024、そしてMac版の同等品には、自動データ変換という設定があります。ファイル、オプション、データと進むと見つかります。ここにはExcelが自動で適用する変換が並んでおり、数値テキストの先頭の0の除去、数値の15桁への切り捨て、日付や指数表示に見える文字と数字の文字列の変換などが含まれます。不要な変換のチェックを外せば、Excelは今後のファイル開示でそれらの値をテキストのまま残します。ダブルクリックで開く場合も含みます。
この設定に頼る前に、2つの注意点があります。1つ目は、将来の動作だけが変わることです。すでに変換されたセルは修復されず、すでに捨てられた桁も戻りません。先週開いたファイルは、ブックの中に変換された値を今も持っており、コードを取り戻せるのは元のファイルからの新しい取り込みだけです。2つ目は、この設定がファイルではなくあなたのパソコンに保存されることです。既定の設定のままのパソコンで同じファイルを開く同僚は、今も0を除いたコードを見ることになり、送り出したファイルには何の保護も付いていきません。この設定は自分のパソコン向けの便利な機能として扱い、共有するファイルには取り込みによる修正を信頼できる方法として扱ってください。区切り文字と文字コードという、Excelが開くときに行う残り2つの推測については、1列にまとまる問題と文字コードの問題の姉妹ガイドで扱っており、下の関連ガイドからリンクしています。
対処法3:作る側がコードを最初からテキストとして持つ
CSVを作る側なら、最も強い対処法は、Excelに届く前に元のデータをあいまいでない形にすることです。JSONでは、コードを数値ではなく文字列として持つことです。文字列の00123は文字00123に変換されますが、数値の123は123に変換され、保持すべき0がそもそもありません。これはコンバーターの設定ではなく元データの決断です。元の数値が持っていなかった0を、どんなコンバーターも作り出すことはできないからです。元のシステムがすでに郵便番号を数値として保存している場合、0は変換の前に消えており、元に戻せるのは元のシステムだけです。たとえば、コードを固定幅の文字列として再書き出しする方法があります。
すでに0を失った値でも、長さが固定されている場合には、正当な再構成方法が1つあります。TEXT関数です。列のすべてのコードが5桁なら、TEXT関数でA2セルを00000の書式にすれば、除かれた数値から表示とテキスト値を再構築できます。欠けた桁はすべて0で、その数が分かっているからです。結果をコピーし、値として貼り付けて固定します。ただし、これは長さが固定され、被害が先頭の0の脱落だけの場合にしか使えません。切り捨てられた長いIDは再構成できません。失われた桁は0ではなく、0に置き換えられた未知の桁だったため、どんな数式も推測できないからです。IDの長さがばらばらだったり15桁を超えたりする場合は、桁を補うのではなく、元データから作り直してください。
すでに先頭の0を消して保存してしまったファイルの救出方法
ここまでの対処法はすべて、ディスク上のファイルは今も正しく、間違っているのはExcelの表示だけだという前提でした。しかし、0を除いた版がすでに保存されてしまっている場合もあり、そのとき問題になるのは、保存されたコピーから元のコードをまだ取り戻せるかどうかです。答えは、保存が何をしたかによって決まり、区別すべきケースが2つあります。1つ目は、ディスク上のファイルに今も元の文字が入っており、間違っているのはブックの表示だけというケースです。テキストエディターでの確認が検出するケースで、エディターに0が表示されるなら何も失われておらず、対処法1で表示を直せます。2つ目は、ディスク上のファイル自体が今は0を除いた値を持っているケースです。Excelで開き、短くなったコードを見て、CSVに保存し直したことで、変換された値がファイルに書き込まれてしまったのです。
2つ目のケースが取り戻せるのは、限られた状況だけです。すべてのコードの長さが固定され、被害が先頭の0の脱落だけなら、対処法3のTEXT関数で再構築できます。欠けた文字が0だと分かっているからです。必ずコピーで作業し、唯一の版では作業せず、Excelで再び開く前にテキストエディターで結果を確認してください。被害が精度の切り捨て、つまり15桁を超えるIDの末尾が0に置き換わったものなら、元の桁はそのコピーから消えています。プレースホルダーに置き換えられた桁を、デコードも書式設定も数式も取り戻すことはできません。プレースホルダーには、どの桁に置き換わったかという情報が含まれていないからです。その場合は、コピーの修復をやめて、元からファイルを再生成してください。データベースやツール、元のJSONから再書き出しし、今度は対処法1で開きます。そして、再生成したファイルの確認が済むまでは、壊れたコピーをそばに残しておいてください。置き換えを確認する前に唯一のコピーを削除することこそ、取り戻せる問題を失われたデータセットに変えるやり方です。
このページのコンバーターで作ったファイルの場合
このページのコンバーターは、まさにこのガイドが扱う種類のファイルを作るので、その動作をはっきり述べておく価値があります。ダウンロードされるファイルは、JSONが持つコードをそのまま保持します。これは推測ではなく、実際のコードで検証しました。変換エンジンを、コードの00123、00456、00078、郵便番号の02138と07477、18桁の注文IDである123456789012345678を含む3行のサンプルで実行したところ、すべての値がCSVにバイト単位でそのまま出力され、コードは区切り文字を含まないため引用符なしで、長いIDも手を付けられていませんでした。つまり、変換したファイルがExcelで0を除かれて表示されるなら、変換は何も壊していません。ファイルは正しく、Excelがダブルクリックで型を推測したのです。
変換したファイルには、すっきりした選択肢が2つあります。1つ目は取り込みの手順です。ダウンロードしたファイルをデータ、テキストまたはCSVからで開き、データの変換をクリックし、すべてのコード列をテキストに設定して読み込みます。コードは正しく読み込まれ、ファイル自体は何も変えていないので、ほかのすべてのツールでも有効なままです。2つ目は、自分のパソコン向けに対処法2の自動変換の設定を使うことです。型の推測による表示の問題を直すためにデータを再変換してはいけません。また、変換した出力を表計算ソフトに貼り付けて保存し直してもいけません。その往復こそ、このガイドと姉妹ガイドが防ぐためにある、区切り文字と文字コードと型の食い違いを持ち込むからです。データを直すのではなく、開き方を直してください。
もう1つ、コンバーターの詳細がここでは重要です。コンバーターでは、ダウンロードの前に区切り文字を選べますが、その選択は型の推測とは無関係です。ファイルは、区切り文字が正しくてコードの0が除かれていることもあれば、コードが正しくて区切り文字が間違っていることもあれば、両方とも間違っていることもあります。変換したファイルが1列で開き、コードもおかしく見える場合は、同じ取り込みで両方の設定を直してください。変換のときに選んだ区切り文字を選び、コード列をテキストに設定します。区切り文字の半分は1列にまとまる問題の姉妹ガイドで詳しく扱っており、文字の半分は文字コードのガイドで扱っており、両方とも下の関連ガイドからリンクしています。
予防チェックリスト:誰も直さなくて済む書き出し方
型の推測は、書き手と読み手の食い違いです。だから予防とは、書き手が値が何であるかを、読み手が守る形で宣言することです。CSVを作るときにこのチェックリストを回せば、次に開く人はこのガイドを必要としません。1つ目は、コードを元データで文字列として持つことです。データに郵便番号やSKU、IDが入っているなら、元のシステムでテキストとして保存してください。数値型では、書き出しの前に0が消えてしまうからです。2つ目は、読み手がExcelなら、ファイルの開き方を伝えることです。コード列をテキストに設定して取り込むよう伝える1行の注意書きをファイルに添えれば、問題全体を防げますし、コストはかかりません。
3つ目は、救出したファイルをテキストエディターで確認するまでは、元のファイルに上書き保存しないことです。Excelからの保存は、Excel独自の既定値で型と区切り文字と文字コードを書き直します。次の読み手のために食い違いを再び持ち込むことも、表示だけの問題を本当のデータ損失に変えることもあります。4つ目は、ファイルを受け取ったときに何かおかしく見えたら、まずテキストエディターで開き、表計算ソフトに上書き保存させる前にコードを確認することです。そして5つ目は、元のデータを残しておくことです。CSVはデータそのものではなく、平らにしたスナップショットです。救出がうまくいかなくても、元データがあればきれいに再書き出しできます。コードの悲惨な話のほとんどは、壊れたCSVが唯一のコピーだったと遅れて気付くことで終わります。あなたのファイルがそうならないようにしてください。
関連ガイド
よくある質問
ExcelがCSVのコードの先頭の0を除くのはなぜですか?
CSVファイルにデータの型の情報がなく、Excelがファイルを開くときに各値の型を推測するからです。00123のようなコードは数値に見えるため、Excelはそれを数値の123として保存し、数値には先頭の0がありません。ファイル自体には今も00123が入っています。データ、テキストまたはCSVからでファイルを取り込み、読み込む前にコード列をテキストに設定すれば、0は残ります。
CSVでコードを引用符で囲めば、Excelで先頭の0は残りますか?
いいえ、残りません。Excelは取り込みのときに引用符を取り除き、中の値に同じ数値の推測を当てはめるため、引用符付きの00123は引用符なしの00123とまったく同じように123になります。引用符が制御するのは、値の中のカンマの扱い方であって、Excelが値に付ける型ではありません。変換を防げるのは、取り込みのときに列をテキストに設定することだけです。
長いIDの末尾の桁がExcelで失われたのはなぜですか?
Excelの数値は有効数字15桁までしか保持しないからです。15桁を超えるIDは、Excelが数値として保存するときに余った桁が0に置き換わるため、1234567890123456は1234567890123450になります。失われた桁は隠れているのではなく、そのブックからは消えています。読み込む前に列をテキストとして取り込むか、すでに保存してしまった場合は元データからファイルを再生成してください。
列をテキスト形式に書式設定すれば、先頭の0を取り戻せますか?
Excelがすでに値を変換してしまった場合、いいえ、取り戻せません。書式設定は今後の入力の扱い方を変えますが、ファイルを読み込んだときに捨てられた桁を戻すことはできません。すでに変換されたファイルの唯一の対処法は、元のファイルからコード列をテキストに設定して新しく取り込むか、長さが固定されたコードに限ってTEXT関数で再構築することです。
Excelがコードを自動で変換しないようにするにはどうすればいいですか?
Microsoft 365またはExcel 2024では、ファイル、オプション、データと進み、先頭の0の除去と長い数値の切り捨てに関する自動データ変換のオプションをオフにします。これは自分のパソコンでの今後のファイル開示だけが変わります。すでに変換されたセルは修復されず、ほかのパソコンで開く人に対してファイルは保護されないため、共有するファイルには取り込みによる修正が今も信頼できる方法です。
郵便番号は0を失うのに、商品名は問題ないのはなぜですか?
型の推測は、数値に見える値にだけ影響するからです。商品名には文字が含まれているため、Excelはテキストのまま残します。数字だけでできた郵便番号やSKU、IDは数値に見えるため、Excelは変換します。ルールは単純です。値が数量ではなく数字でできたラベルなら、見た目にかかわらずテキストとして取り込まなければなりません。
Excelが先頭の0を除いたら、CSVファイルは壊れていますか?
ほぼ確実に壊れていません。ファイルをテキストエディターで開いてください。そこでコードに0がすべて付いて表示されれば、ファイルは無事で、直す必要があるのはExcelの開き方だけです。ファイルが壊れるのは、変換のあとにExcelから保存した場合だけです。その保存で0を除いた値がファイルに書き戻されるからです。それまでは、保存せずに閉じて、コード列をテキストに設定して取り込み直してください。
変換してから、テキストとして取り込む
このページのコンバーターにJSONを貼り付け、すべてのコードが書かれたとおりに保持されたCSVをダウンロードしてください。次に、データ、テキストまたはCSVからで開き、コード列をテキストに設定すれば、先頭の0も長いIDもすべて残ります。アップロードなし、登録なし、ブラウザーのタブの外に何も出ません。
JSONからCSVへのコンバーターを開く