すべてのガイド

TSV・CSV のガイド

Excel がデータを勝手に書き換えてしまう理由

Excel は気まぐれにファイルを壊しているのではありません。セルを読んだ瞬間に、決まった 4 つの変換を当てているだけです。どれに当たったかが分かれば、値が戻せるかどうかも分かります。

ファイルを書き出して、確認のために開いたら、データが違っている。商品コード 00417 が 417 になっている。参照用の MAR1 が 3 月の日付になっている。19 桁の注文番号の末尾に、もとはなかったゼロが並んでいる。

これはどれも不具合ではなく、どれも偶然ではありません。Excel は値を読むときに決まった変換の組を当てており、それぞれに予測できる規則があります。役に立つ問いは「なぜ壊れたのか」ではなく、どの変換に当たったのかです。それによって、元の値がまだ残っているかどうかが決まります。

4 つの変換

Excel 自身が、後述の設定画面でこれらに名前を付けています。「Excel がデータを変えた」という報告のほとんどは、この 4 つで説明がつきます。

先頭のゼロが取り除かれる。 00123 が 123 になります。数値に見えるものは数値として保存され、数値には先頭のゼロという概念がありません。郵便番号、商品コード、口座番号、そして桁を揃えるためにゼロで埋めたあらゆる識別子がこれに当たります。

桁の長い数値が末尾を失う。 Excel は数値を 15 桁の精度で保存します。16 桁の値は先頭の 15 桁だけが残り、あとはゼロになります。12345678901234567890 は 12345678901234500000 として保存され、1.23457E+19 と表示されます。注文番号、カード番号に似た参照番号、長いデータベース ID がここに落ちます。

途中に E が入っているものが指数表記になる。 1E5 は 100,000 と読まれます。化学物質の識別子や、短い英数字のコードがこれに捕まります。

英字と数字が続いたものが日付になる。 MAR1 が 3 月 1 日になります。遺伝子の命名にかかわる人たちが遺伝子の名前を変える決断をしたのは、この変換のためです。SEPT1 や MARCH1 が、表計算ソフトの中では使いものにならなかったからです。

値が消えるものと、隠れているだけのもの

ここが重要な分かれ目で、画面を見ているだけでは分かりません。

先頭のゼロと日付は、元に戻せます。 値の型は変わりましたが、文字についての情報は捨てられていません。417 は、あとから付け直せる桁埋めを除けば 00417 が持っていたものをすべて含んでいますし、日付は MAR1 が表していた月日を保持しています。痛みは伴いますが、元の形式が分かっていれば復元できます。

15 桁での切り捨ては、戻せません。 その桁は消えています。Excel はそれを隠したのでも、表示を変えただけでもありません。数値を丸めて、その結果を保持しました。セルの書式をどう変えても戻ってきません。そのセルは、もう元の値が何だったかを知らないからです。

長い識別子を含むファイルを「ちょっと見るだけ」で気軽に開いてはいけないのは、これが理由です。見ることそのものが破壊的な操作であり、そのあと保存すれば、失われた状態がディスクに書き込まれます。

設定と、それが防ぎきれない 1 つ

最近の Excel では、これらを切ることができます。ファイル → オプション → 詳細設定の中の自動データ変換に、上の 4 つに対応するチェックボックスが 4 つあります。Windows でも Mac でも、Microsoft 365 版と Excel 2024 に存在します。

これを切れば、Excel はそうした値を文字列として保ちます。やっておく価値がありますし、この画面を見たことがある人はほとんどいません。

ただし、4 つ目はよく読んでください。「連続する英数字を日付に変換する」を無効にすると、JAN1 が日付になるのは止まります。しかし Microsoft 自身の文書が、空白や区切り記号を含む値——JAN 1、JAN-1——は依然として日付として扱われる場合があると注記しています。つまりこの設定は、きれいな形だけを引き受けて、実際に手元にありそうな 2 つの形を残します。

もう 1 つの限界があります。設定はあなたの端末に属します。同じ書き出しを自分のノート PC で開く同僚の環境は既定のままであり、ファイルは変換された状態で返ってきます。

保存時ではなく、開いた時に起きる理由

CSV や TSV は、型の情報をまったく持たないテキストファイルです。00417 は 5 文字であり、それが数値なのか、コードなのか、たまたま数字でできた文字列なのかは、ファイルのどこにも書かれていません。Excel は何かを表示する前に、すべてのセルについて型を推測しなければならず、その推測の中身が先の 4 つの規則です。

「開いただけです」が弁明にならないのはこのためであり、気づいたときにはもう被害が出ているのもこのためです。変換は読み込みの最中に起こります。保存がそれを引き起こすのではありません。保存はそれを確定させるだけです。

同じことが、ほかのどこでもファイルが正常である理由も説明します。それを受け取るデータベースも、スクリプトも、取り込み処理も、文字を文字として読みます。この連鎖の中で、あなたの識別子を数量だと判断するのは Excel だけです。

元の値を取り戻す

望ましい順に並べると、こうなります。

  1. 書き出し元に戻る。 それが残っていて、上書きされていない場合です。丸ごと確実に戻せるのは、この経路だけです。
  2. 元のファイルを正しく取り込み直す。 該当する列を強制的に「文字列」にします。ファイル自体が Excel から保存し直されていなければ有効です。
  3. 組み立て直す。 元に戻せる場合にかぎります。既知の桁数まで先頭のゼロを付け直す、日付をそれが表していたコードに戻す。必ず一部を書き出し元と照合してください。MAR1 と MAR10 は、同じようには往復しません。
  4. 切り捨てられた長い数値については、できることはありません。その桁は、そのファイルからは復元できません。

そもそも書き出したファイルをこれから開くところなら、CSV を壊さずに開く方法が、4 つの変換をすべて回避する取り込みの道筋を扱っています。

ここでやる場合

このサイトのエディタは TSV・CSV のセルの値を文字列として読み、日付や数値に変換しません。00417 は 5 文字のまま、19 桁の識別子は 19 桁のままです。書き出す前に、検出した文字コードと表示されたセルを確認してください。

これは機能の不足ではなく、意図した制限です。値を解釈するツールは、値を誤って解釈しうるツールでもあります。この道具は、文字そのものが要点であるファイルのために存在しています。

TSV・CSV の書き出しでは、再読み込みで値と行構造が一致するか確認します。UTF-8 で保存し、TSV はタブ、CSV はカンマで区切ります。不要な引用符が外れる場合があります。ダイアログにはレコード間の改行、BOM、末尾の改行と変換内容を表示し、表を再現できない出力は止めます。アップロードはなく、ファイルを読み書きするのはブラウザです。