CSVさんが勝手に先頭の0を消しやがるので抵抗する

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
そういや稲川さんの怖い話ってちゃんと聞いたことはないなぁ

この記事を三行にまとめると

先頭の0が消えてしまうんですよ
0だけに、霊のようにふっと消えてしまうんですよ
おかしいな〜怖いな〜
数字ではなく文字列として「0001」みたいな値を扱うことって、あると思うんです。

でもPHPでその値をCSVなんかに落とし込もうとしますとね、先頭の0が消えてしまうんですよ。ちゃんと「$val = ‘0001’」みたいに書いているのに、いざCSVで確認しますとね、0がね、どこにもいないんですよ。0だけに、霊のようにふっと消えてしまうんですよ。あれ、おかしいな〜怖いな〜って思いながら改めてもう一度確認してみてもね、やっぱりいないんですよね。そこにいるのは「1」だけなんですよね。

たぶん、EXCELでも同じだと思うんですよねぇ。



先頭の0が消えると困っちゃうってときは、「0001」をそのまま入れるんじゃなくて、数式を入力するときのような書き方をすれば良い。「=”0001″」と入力すると、セル上は0が消えずに「0001」となる。

PHPでCSVファイルを作成するときも一緒ですね。

$list = array('="0001"','="0002"','="0003"');

$fp = fopen('sample.csv','w');
fputcsv($fp,$list);

例えばこんな感じですね。これで「0001」「0002」「0003」が入ります。

たいしたことじゃないんだけど、知ってると知らないじゃ結構でかいっすからね。僕も最近までこのこと知らなくて、先頭に0を入れるような数字のみのデータは許可しないってことで妥協してたんですけど、どうしても妥協できない状況に来てしまったので、調べてみたらこんな程度のことで良かったと。こんなことならもっと前に調べときゃ良かった。

こういう、CSVが自動で型を判定して良い感じに直してくれる機能自体は素晴らしいんですが、ときどきありがた迷惑ですよね。分数で「3/5」とか入れると、勝手に日付けに直しちゃうとか。

まあ、もしやと思って試しに「=”3/5″」って書いたら同じように回避できたので、焦るこたぁないです。

$list = array('="0001"','="3/5"','3/5');

$fp = fopen('sample.csv','w');
fputcsv($fp,$list);

これで、それぞれ「0001」「3/5」「3月5日」と入るわけですね。

今回はCSVでしか検証しませんでしたけど、たぶんEXCELも同じやり方でいけると思うので、「おかしいな〜嫌だな〜」って悩んでる方はお試しあれ。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2017年02月27日 18:01:13
通りすがり
通りすがりですが、探していた内容にドンピシャだったので非常に助かりました。
ありがとうござます!
2017年02月28日 10:21:43
まっち~(管理人)
いえいえ、お役に立てて良かったです。
2018年05月15日 16:40:39
すれちがい
すれちがいですが、非常に助かりました。ありがとうございます。
実はcsv専用の編集とviewできるエディタがあれば一番理想ですよね。
2018年05月16日 11:17:20
まっち~(管理人)
いえいえ、お役に立てて何よりです。
確かにエディタがあれば良いなあとは思いますね。作業がだいぶ楽になりそう。
2021年10月02日 12:30:14
ありがちょん
このテクニック、メカラウロコデス。。。
2021年10月02日 14:50:26
まっち~(管理人)
アリガトゴザイマス