CSVをExcelで開くと0が消える・日付になる|定番の対策が効かない理由と直し方

CSVをExcelで開くと0が消える・日付になる|定番の対策が効かない理由と直し方
当サイトはアフィリエイト広告を利用しています。
この記事に出てくる用語
  • CSV … 値をカンマ(,)で区切った、文字だけのファイル。名簿やデータ出力に使われる
  • ダブルクォート … 半角の二重引用符 "。CSVでは "0120001" のように値を囲む
  • 文字コード … 文字をファイルに記録する方式。Shift-JISやUTF-8などがある
  • BOM(ボム) … UTF-8の先頭に付ける目印。「BOM付き」と「BOMなし」の2種類がある
  • シリアル値 … Excelが日付を管理する通し番号。2026年に開くと 1-2 は46024になる

この記事は3つの状況に向けて書いています

いまの状況読むところ
開いたら値が変わっていた・文字化けしていた「開いただけなら、元のファイルは無事です」
壊れた状態で、もう上書き保存してしまった「すでに保存してしまった場合」の節
CSVを作って人に渡す側で、壊れない形にしたい「効く対策」と「状況別の選び方」の節

結論:ダブルクリックで開くと4種類の壊れ方をする

CSVをダブルクリックしてExcelで開くと、値が勝手に変わります。壊れ方は大きく4種類です。

壊れ方例
先頭の0が消える0120001 → 120001
日付に変わる1-2 → 1月2日
長い数字が別の数字になる1234567890123456 → 1.23E+15
文字化けして列がずれる「コード」→「繧ウ繝シ繝・」

上の3つはExcelが値の種類を推測して変換するために起き、4つ目は文字コードによって結果が分かれます。

よく紹介される「値をダブルクォート(半角の ")で囲む」対策では、この変換は止まりません。
止まるのは「値の頭に = を付ける」方法で、使えるのはCSVを作る側だけです。

受け取る側は、[ファイル]→[オプション]→[データ]で自動変換を止めます。
ただし公式の説明と対応しているのは先頭の0と長い数字で、1-2 の日付化は止まらない可能性が高いです。

開いただけなら、元のファイルは無事です

Excelで開いて表示が変わっていても、CSVファイル本体はまだ書き換わっていません。
Excelは開くときにファイルを読むだけで、書き込みは保存したときに起きます。

元のデータが失われるのは、壊れた状態のまま上書き保存したときです。
変な表示に気づいたら、保存せずに閉じてください。元のCSVはそのまま残っています。

何が壊れるか|値の変換

対策をせずに開くと、次のようになります。

CSVに書いた値Excelでの表示セルの中身
0120001(郵便番号)120001120001(数値)
1-2(商品コード)1月2日46024(日付のシリアル値)
1234567890123456(16桁の管理番号)1.23E+151234567890123450
03-1234-5678(電話番号)03-1234-5678そのまま(文字列)

商品コードの 1-2 は「2026年1月2日」になり、元の表記は残りません。
何年になるかは、開いた年で決まります。

1.23E+15 は「1.23×10の15乗」という意味の表記です。
セルの中身は 1234567890123450 で、下1桁が失われています。表示形式を数値に直しても戻りません。

電話番号が無事なのは、数値としても日付としても読めない形だからです。
同じハイフン入りでも 1-2 は日付として読めるので変換されます。「ハイフンなら安全」ではありません。

自分のデータのどれが危ないか

次の形に当てはまる値が、変換の対象になります。

  • 数字だけで、先頭が0(郵便番号、ハイフン無しの電話番号、001 のような連番)
  • 数字とハイフンや斜線の組み合わせ(1-2 や 4/5 のような商品コード・枝番)
  • 16桁以上の数字(会員番号、システムの管理番号)

壊れているかを確かめる方法

メモ帳と見比べる手順

  1. 元のCSVを、Excelではなくメモ帳で開く(右クリック→[プログラムから開く]→[メモ帳]。一覧に無ければ[別のアプリを選択])
  2. メモ帳は中身を文字のまま表示するので、そこに見えているのが本来の値です
  3. Excelの表示と見比べて、違っていれば変換が起きています

文字化けと列ずれ|同じUTF-8でも結果が分かれる

画面の日本語が読めない文字になっていない人は、この節は飛ばせます。

同じ内容のCSVでも、文字コードによって結果が分かれます。

文字コード結果
Shift-JIS正常
UTF-8(BOM付き)正常
UTF-8(BOMなし)文字化けする。列の区切りも崩れる

文字化けと同時に、列の区切りも崩れます。
たとえば3列2行のCSVなら、1行目の「コード」と「郵便番号」が1つのセルにまとまり、3つ目が空になることがあります。
2行目は3列のままです。化けた文字が隣のカンマを取り込むと区切りが1つ消えるので、ずれ方はデータによって変わります。

UTF-8には先頭に目印(BOM)が付いたものと付かないものがあり、「UTF-8にしたのに化ける」場合はBOMなしが考えられます。

化けたCSVを開ける形に直す

出力するシステム側で文字コードを選べるなら、Shift-JISかBOM付きUTF-8を選んでください。
手元で直すなら、メモ帳で保存し直します。

化けたCSVをメモ帳で直す手順

  1. 元のCSVのコピーを作っておく
  2. CSVをメモ帳で開く(ここで正しく読めていれば、文字コードの問題です)
  3. [ファイル]→[名前を付けて保存]を開く
  4. 保存ボタンの近くの文字コード欄で「UTF-8(BOM 付き)」を選んで保存する
  5. Excelで開き直し、文字化けと列ずれが消えていれば直っています

メモ帳でも化けて見える場合は直りません。出どころに文字コードを確認してください。

なぜ値が変わるのか

CSVは文字だけのファイルで、「この列は文字列」という情報を持っていません。
そのためExcelは、開くときに値の見た目から種類を推測します。
推測は開いた瞬間に起きるので、後から表示形式を「文字列」に変えても戻りません。
16桁で下1桁が失われるのは、Excelが数値を15桁までで扱うためです。

効かない対策|各値をダブルクォートで囲む

「値を " で囲めば文字列として読み込まれる」という説明をよく見かけます。

対策郵便番号 0120001商品コード 1-216桁の管理番号
何もしない120001 ✕1月2日 ✕1.23E+15 ✕
ダブルクォートで囲む "0120001"120001 ✕1月2日 ✕1.23E+15 ✕

「何もしない」と1つも変わりません。

CSVの決まりごとでは、ダブルクォートは「カンマや改行を含む値を1つにまとめる」ための記号です。
「この値は文字列として扱え」という指示ではないので、Excelは囲みを外してからいつもどおり推測します。

すでにダブルクォート付きで作っているなら、外す必要はありません。害はありません。

効く対策|各値の頭に = を付ける(副作用あり)

これはCSVを作る側が使う方法です。受け取ったCSVをExcelで開いてから付け直すことはできません。開いた時点で壊れているからです。
受け取る側の人は、次の節「自動変換を止める設定」へ。

="0120001" のように、ダブルクォートで囲んだうえで頭に = を付ける書き方です。

対策郵便番号 0120001商品コード 1-216桁の管理番号
= を付ける ="0120001"0120001 ○1-2 ○1234567890123456 ○

3つとも守られます。Excelが「文字列を返す数式」として読むためです。
セルの中身は数式 ="0120001" になり、xlsx形式で保存して開き直しても数式のまま残ります。

⚠️ CSVのまま保存し直すと、次に開いたときにまた壊れます

= 付きのCSVをExcelで開き、CSV形式のまま上書き保存すると、= が消えます。
Excelで加工して保存するなら、xlsx形式を選んでください。

使えるのは、渡す相手がExcelで開く場合だけです。
別のソフトに読ませると ="0120001" という文字がそのまま渡ります。

タブ文字を入れる方法は勧めません

タブ文字(Tabキーで入る空白)を各値の頭に入れる方法もあります。
3つとも保たれますが、見えないタブ文字がセルの先頭に残ります。
検索や突合で「同じはずなのに一致しない」原因になるので、勧めません。

自動変換を止める設定|先頭の0と長い数字には効く

2023年9月にMicrosoft 365(バージョン2309)で追加された「自動データ変換」で止められます。Excel 2024にもあります。

場所は [ファイル]→[オプション]→[データ]→「自動データ変換」。止められるのは次の4項目です。

  1. 先頭のゼロを削除して数値に変換する
  2. ロング数値の最初の15桁を保持し、科学的記数法で表示する
  3. 文字「E」を囲む数字を科学的記数法に基づく数値に変換する
  4. 連続する文字と数字を日付に変換する

このうち上に挙げた症状と対応するのは1と2です。1が0落ち、2が16桁の管理番号にあたります。

4が商品コード 1-2 の日付化を止めるかは、公式に書かれていません。
公式の例は JAN1 のような記号の無い形で、「JAN 1 や JAN-1 などは、なお日付として扱われることがある」とあります。
記号を含む 1-2 は、この設定では止まらない可能性が高いです。

CSVを開くときに「次のデータ変換を実行します」という画面が出ることもあり、そこで「変換しない」を選べます。

効いているかは 0120001 と書いたCSVを開いて確かめます。そのまま表示されれば止まっています。
1-2 に効くかも、同じやり方で確かめてください。残る場合は、次の節へ進みます。

設定が無いExcelや、日付化が残るとき

定番の方法が2つあります。どちらもこの記事では手順まで扱いません。

  • [データ]タブの取り込み機能でCSVを読み込み、列ごとに「文字列」を指定する方法
  • 拡張子を .txt に変えてExcelで開き、出てくる画面で列ごとに型を指定する方法

試すときは、元のCSVのコピーで確かめてから使ってください。

状況別の選び方

状況取る方法
受け取ったCSVを自分が見る・集計するまず設定で自動変換を止める。日付化が残るなら[データ]タブからの取り込みへ
CSVを作って、Excelで開く人に渡す値の頭に = を付け、CSVのまま保存し直すと再発すると伝えておく
CSVを作って、Excel以外のソフトにも読ませる= を付けない。Excelで開く人には設定か取り込みで守ってもらう
Excelで開いて加工した結果を残すxlsx形式で保存する。CSV形式で上書きしない

すでに保存してしまった場合

16桁の番号は復元できません。
下1桁が0になった値で保存されていて、元の値はどこにも残っていません。
出どころから、もう一度もらってください。

先頭の0は、桁数が決まっている値なら復元できます。
郵便番号なら7桁なので、足りない分の0を先頭に足せば戻せます。
0が消えた値に式で0を補う方法は、別記事「顧客リストの名寄せをExcelだけでやる手順」でも触れています。

日付に変わった値は、元が 1-2 だったのか 1/2 だったのかを「1月2日」から判別できません。
元の形式が決まっているなら組み立て直せます。確実なのは、もらい直すことです。

関連する作業

毎月届くファイルをExcelの集計につなぐ作業は、別記事「毎月のExcel転記を別ブックの参照でつなぐ前に」にまとめています。

この記事の確認範囲

  • Windows版のExcelの話です。画面の名前は Excel 2024(日本語版)のものです
  • 値の変換について書いているのは、表に挙げた4つの形です。他の値は同じ仕組みからの推測です
  • 「自動データ変換」の設定は、バージョンによって項目名や並びが違うことがあります
  • メモ帳の文字コード欄の名前も、Windowsのバージョンによって違うことがあります
  • 文字化けについては、Shift-JISとBOM付きUTF-8なら正常に開けるところまでの話です。BOMなしのまま開かせる方法は扱っていません
  • Googleスプレッドシート・LibreOfficeなど、Excel以外は対象外です

まとめ

  • CSVをダブルクリックで開くと、先頭の0・1-2 のようなコード・16桁の番号・BOMなしUTF-8の文字が壊れる
  • 開いただけなら元のCSVは無事。失われるのは、壊れた状態で上書き保存したとき
  • ダブルクォートで囲む対策では止まらず、止まるのは頭に = を付ける方法
  • ただし = はCSVのまま保存し直すと消え、次に開いたとき再発する
  • 「自動データ変換」の設定は先頭の0と長い数字に対応する。1-2 の日付化は止まらない可能性が高い
  • 16桁の番号は、壊れた状態で保存すると復元できない

コメント

タイトルとURLをコピーしました