文字列のはずが数値になって大騒ぎ

低レベルなExcelゴミネタである。しかし、ある意味ではこういう検索は本来の「表計算ごっこ」をしている者であるといえる。
LOG
153.141.131.166 [22/Feb/2017:16:04:31] csv 文字列 数字 区別
210.226.36.245 [11/Oct/2016:11:54:35] CSVファイルを開くと文字列が数値になる
何かのCSVファイルを読み込んだ。そして次のような「郵便番号」になると思っていた(Fig.1)

Fig.1

こうなるハズだと思っていた。
ところが実際は「郵便番号」が次のようになってしまった(Fig.2)。それにオタオタしたオトコたちが出てくる。
これがなんとかならないかというオトコの検索が上のようなものになる。

Fig.2

相手が低能のエクセルバカの言うことであることを考えると、左の図のようになってしまった後から、本来の形(上の図)に戻したいということかもしれない。バカの考えることはこんな程度だろう。

それは無理な相談だ。元の「文字列」が「数値」になった瞬間に、「数値」の前に「0」が何個付いていたかなどという情報は消えてしまっているからである。

It's too late to lock the stable door when the horse has been stolen.
馬を盗まれてから馬小屋にかぎをかけても手遅れである。
いまさら元には戻らない。要するに、「後の祭り」である。

こういう経験をするといくらエクセルバカでも、「数字」が並んでいても、それを「文字列」ととらえるか「数値」ととらえるかで違いがある、ということに気がついたというわけである。こうなる前に手を打つ必要がある。

この問題は、もっとハッキリいえば文字列の最初の部分にある「0」または連続した「0」がカットされるというだけである。しかし、それではもう郵便番号としての意味をなさないことになってしまう。

単にエクセルでCSVファイルを読み込むだけでは、上のように「文字列としての数字」が「数値としての数字」に代わってしまうことが普通である。こうなることについてはMicrosoftは大昔から書いていることである。プログラム不要の解決法もちゃんと書いている。たとえば「サポート技術情報(JPKB.CHM)」の「Excel/Excel97/[XL97]テキストファイルについて」の「Excel 97 におけるテキスト ファイルの取り扱い補足」の項など(Fig.3)
Fig.3


CSVという狭い範囲の問題ではない

この問題は以前に「CSVファイルの処理/切り分けてExcelファイル化(ipc_0036)」でやったように、4桁の数字で表された「店(舗)番号」が上の郵便番号と同じパターンになっている。この処理と同じである。

あの時はC言語でやったが、CSVファイルのこの対処法ほど、VBAでの処理(面倒)とC言語での処理(簡単)に大きな差があるものはないだろう。

ところで、数値計算を主とする表計算ソフトとしては「数字」は「数値」として扱うというのは合理的な仕様である。となると、「数字」を「文字列」として扱うことはCSVファイルにだけ問題となるものではない。下記のような通常のシート上のデータにおいても問題になることである。


VBAで住所や誕生日などのデータを個別に分解して各セルに分ける場合などにもこういう問題が起こってくる。

CSVファイルでは列単位での「文字列」としての設定でよかったが、この場合ではセル単位での「文字列」の設定になる。そしてこちらの方が本源的な問題であって、CSVファイルでの場合はその範囲を列全体にまで引き延ばしただけということになる。
簡単に言えば「セルデータ分解時の文字列と数値(exc_0084)」と根は同じである。

いずれにしても、エクセルバカのように「CSV」「CSV」とバカの一つ憶えのように言っているだけでは、モノの本質を見失うということになる。この問題はCSV(ファイル)などとは何の関係もないということである。しかし、単細胞的思考しかできないバカはCSVだけにしか目が向かないのである。

もっとも、このCSVの問題も、またエクセルバカが言うTSVファイルの問題も、VBAなど使わなくてもすむのに(もちろんC/C++言語もお呼びでない)、バカほど知りもしない「VBA」や「VB.NET」などと言い出すから困ったものである。


関数化の利点

この点で興味深いのは次の例である。「オバカの好きな2進数」のところで、数字が「文字列」として扱われている、すなわち先頭に「0」が付いているが、セルの左上に目障りな「緑色の三角形もどき」が出ていない。これは自作の関数で戻り値を文字列としているからであろう(推測)。
ここで使っている関数については「2進数と16進数(vba_0042)」を参照。


参考
Sheet3@Exc2.xlsm
Shinsu.bas@Exc2.xlsm






CSVファイル読み込み時の数値と文字列[1](ipc_0120)


シートで使う2進数と16進数(vba_0042)
OpenTextの使い方(exc_0084)




Unicode,UTF-8,UTF-16,Big,Little,Endian,LE,BE,Shift_JIS,SJIS,CR,LF,CRLF,byte,bit,word,CSV,BOM,Encode,Decode,ANSI, Binary,Open,Byte,Get,Put,Input,InputB,Asc,AscB,AscW,Chr,ChrB,ChrW,Hex,Mod,EOF,LOF,Loc,FreeFile,ReDim,Encoding, Left,LeftB,Right,RightB,Mid,MidB,Len,LenB,InStr,InStrB,FileSystemObject,FSO,CreateTextFile,OpenTextFile, バイナリ,テキスト,文字列,文字コード,16進コード,16進文字列,変換,ビッグ,リトル,エンディアン,ユニコード,改行,サンプル, バイト,ビット,ヘキサ,2進数,16進数,読み込み,書き込み,エンコード,デコード,解析,変換,判定,判別,バイナリエディタ, 全角,半角,カタカナ,ひらがな,漢字,