CSVをExcelで開いて上書き保存したら数字が0埋めに変化した件への対処

ExcelでCSVファイルを編集した後に保存したらデータが壊れてしまった、というご質問をいただきました。
内容を確認したところ、桁あふれエラーになっていたものと思われます。強制的に文字列として扱うことで解決しました。

Excel
CSVを扱う際の注意事項

Excelは、CSVファイルを直接開くことができます。が、ファイルに含まれている内容によっては、取り扱いに注意が必要です。
仕組みが分かれば対処のしようもあると思いますので、どのように動いているのか認識しておきましょう。
プログラムの話ではなく、考え方の話です。

前提を確認し、余談を挟んで、実践編です。

今回の事象: CSVの数字データが0に

はてな

質問いただいた内容は、おおむね以下のようなことです。
箇条書きにまとめます。

  • ExcelでCSVファイルを開いた。
  • 内容を編集して保存した。
  • Excelをいったん閉じた。
  • あらためてCSVを開くとデータの内容が変わっていた。

勝手に書き換わってしまっていたということです。恐怖ですね。
ちなみに、変わってしまったデータは数字の羅列です。
特別なコードのようなもの(社員コードや商品コードのようなもの)で、数字のみで構成されたものです。

ファイルやExcelの操作に特別なことはなく、一般的なExcelファイルと同じように、ダブルクリックで開くとか、名前を付けて保存するとかいったことでした。
どこかから入手したCSVファイルをExcelで開き、内容確認後、間違いを訂正して、保存したということです。

すべてデフォルト設定(初期の標準設定)が適用されるような動きですね。
ここに危険が潜んでいるのです。場合によって、デフォルトは仇となります。

前提になる知識

メモ

まずは、問題解決に向けて前提となる知識の整理です。
お勉強のようになってしまいますが、なるべく簡単に書きます。
がんばって理解してください。

これらのことを分かっていないと、解決策に進めないのです。

数字の羅列は「数値」になる

Excelは表計算ソフトです。
当然のことでご存じだと思いますが、あえて書きます。
ここが大事なのです。

文字列化

計算のためのソフトウェア(アプリ)ですから、数字があれば「数値」として扱おうとします。
まずは「数値」なのです。文字列の方がイレギュラーです。
たとえば、マイナス記号もカッコ記号も、まずは「数値」として解釈します。全角の算用数字も数値として解釈します。そういうものです。

「数値」と書いているのは、Excel上では数値と文字列が明確に分かれるからです。
これは、画面上で見えているものという意味ではなく、Excelが認識しているデータのレベルでの話です。

Excelが扱える「桁数」は決まっている

Excelが扱える数値は15桁までです。
サポートページにも書かれています。

15桁を越えた部分はエラーとして扱われ、「0」になってしまいます。
今回問題になったところですね。

これはExcelの仕様なのです。
プラットフォームとしてExcelを使う以上、これに従う以外の方策はありません。
16桁以上の数値を扱いたい場合は、文字列化して対処しましょう。詳細は後述します。

エラー表示には意味がある

よくよく確認すると、データがおかしくなってしまうセルには、次のような表示がありました。

2E+14

これはエラー表示です。
セルに表示できないかたちになっていますよ、ということです。
何らかの対処が必要です。詳細は後述します。

Blog Admin
Blog Admin

お気づきの方もいらっしゃるかと思いますが、上記のエラーを解釈すると、「14桁でエラー」です。
おかしな話です。桁数制限には引っかかっていないのです。
ということで、文字コードも怪しいですね。

Blog Admin
Blog Admin

・・・ということになりました。
今回は問題になるポイントが複数混合でした。

余談: 実物から分かったこと

バイナリー

怪しいところが多かったので、実物をご提供いただき確認しました。

対象のCSVファイルをサンプル提供いただき、テキストエディターで開いてみました。
分かったことがいくつかあります。

  • 文字コードがUnicode
  • 改行がLF Only

UNIX系のシステムで作られたCSVファイルですね。
Windowsで扱うにはコツが必要になるのです。

出力元システムを設計された方を悪く言いたくはありませんが、正直、センスがなさすぎます。。
ユーザーが何をするつもりでCSVを出力したがっているのかは、しっかりと確認すべきですし、気を利かせるべきです。
そもそも数字が15文字を越えることが分かった時点で、何らかの手を打つべきでしょう。

対処方針: 文字列化する

15文字を越える(16文字以上の)数値をExcelで扱うためには、文字列化が必須です。(正確に「15文字相当の値」ですが。。)

ここに文字列を書くよ、ということをまずはExcelに認識させます。
認識させた場所(セル)であれば、数字を打ち込んでも文字列とみなしてくれます。

他に、データ入力時に文字列であることを明示する方法がありますが、今回はCSVを開く操作から始まるので使えません。

文字列は明示が必要

Blog Admin
Blog Admin

先に書きました前提知識のおさらいです。
そして、前提知識の追加です。
次項が実践編です。

先に書いたとおり、Excelでは「数値」の扱いが優先です。
数字の羅列を表示しろと言われたら、たとえ何文字であっても、「数値」として扱おうとします。
デフォルト設定の恐ろしさです。

そこで、15文字を越える数字の羅列は、「文字列」としての明示が必要です。
文字列であれば、1セル内に32,767文字まで設定できます。
ないとは思いますが、念のため、この数字が制限事項になります。

データを文字列として扱うためには、「セルの書式設定」で「文字列」として明示するなどの方法があります。
いずれにしても、明示しなければ、デフォルトで数値です。

文字列の枠に収める

Excel

どうやって文字列にするかという話です。
ここが今回の対処の実践編です!
方法が複数あります。

たとえば、以下のような方法で数値を文字列化します。
今回はCSVが元データですので、おおむね3パターンが考えられます。データ(行も列も)数が多いという前提で想定した操作です。

  • 貼り付け時に設定
  • 書式設定後に貼り付け直す
  • 展開時に設定【今回対象外】

個人的に好きなのは、マクロを組んでしまうやり方です。
CSVを開く際に、データを「文字列」として指定できるのです。
その方法はまた別途で。

貼り付け時に設定

新規ブックへのテキストの貼り付け時、区切り位置指定ウィザードを利用します。
おすすめの方法です。

貼り付け時に設定
  1. CSVファイルをメモ帳で開く
  2. すべて選択してコピー
  3. まっさらなExcelに貼り付け
  4. 「区切り位置指定ウィザード」起動
  5. 「列のデータ形式」で「文字列」を指定
ピン

「区切り位置指定ウィザード」は、大きなテキストを貼り付けた際に貼り付け位置の右下に表示されるオプションボタンか、「データ」タブ内の「区切り位置」で呼び出せます。
対象データすべてが選択されていることを確認してください。

純粋なCSVであれば、区切り文字はカンマのみです。
ウィザードで列ごとに「文字列」などを選べます。すべての列を選択することも可能です。

CSVファイルをメモ帳で開くためのは、ファイルを右クリックして「プログラムから開く」か、メモ帳を起動後に対象ファイルを開くかなどです。

書式設定後に貼り付け直す

編集するかどうか分からない状態で、まず内容確認するのであれば、この方法になると思います。
CSVファイルをExcelで開いた状態からの操作です。
あまりおすすめできない方法です。

書式設定後に貼り付け直す
  1. データ部分(もじくは文字列返還したい部分)を選択
  2. 右クリック等でセルの書式設定
  3. 表示形式を「文字列」に変更
  4. 選択状態のままコピー
  5. メモ帳などに貼り付け
  6. 貼り付けたデータをコピー
  7. 元のExcelに貼り付け

まわりくどくなってしまいますが、テキストを文字列として扱ってもらうためには貼り付け直しが必須です。
データは上書きしてしまうので、Excel側のクリアなどは不要です。(念のためクリアしてもよいですが、書式設定までクリアしてしまわないように注意してください。)

展開時に設定

この方法はここでは書きません。
マクロをちゃんと書けば、けっこう簡単に実装できます。

ときどき不思議なことが起こるので注意

基本的にはデフォルトで使えるようにできているExcelですが、時として、不思議なことが起こり得ます。
ただし、ほとんどの場合、それは仕様どおりなのです。

グラフ

多くの場合は気にせずに使えますので、あまり深く考えなくてもよろしいかと。

ただ、何か起こった時には、仕様を確認してみましょう。
けっこう答えが分かるものです。

もしくは原点に立ち戻ってみればよいのです。
今回は、この記録を書くために数値の最大数を確認しましたが、桁あふれだろうということは想像できました。
対処方法はもともとやっていたことでしたし。
ある程度の知識経験があれば、経験則的に分かることもあるでしょう。

脳

あわてず騒がず紐解いていけば、コンピューターの世界は必ず答えにたどり着けます。
マシンに気分などないのです。(今はw)

ご意見やご感想などお聞かせください! コメント機能です。

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