久々にハマったので…
開発中のシステムのDBを修正するのに、CSVでダウンロード→CSVでアップロードという流れになりました。
そこで、実際にテストを行ってみたものの、どうもおかしい。
なぜかアップロード時に、うまくデータが読めていないようなのだ。
その旨、連絡した所、他の環境では発生しないという。
そこで、こちらがダウンロードしたデータと、EXCELで開いて保存したデータをメールで送る。
ダウンロードしたデータは、システムに喰わせても問題ない。一旦開いて保存したものはエラーになる。
ところが、メールを受け取った仲間の環境では、問題が置きないという。?????
こちらの環境の問題か?と思い、先ほどのEXCELで保存したcsvを仮想マシンのWindows上からシステムに喰わせるが、相変わらずエラーになる。
念のため、ブラウザを変更し、chrome/Firefoxなどでも試す。全滅。
Andoroid上のから、試すも同じようなエラーが出る。
ということは、システムの問題か?と疑うが、誰もエラーにならないという。
そこで、向こうで同じ条件でデータを吐き出し、更新可能なデータを送ってもらう。
パッと見は同じ。
diffでチェック
とりあえず、こちらから送ったデータと、向こうから来たデータをdiffで確認。
全く同一だ。
バイナリエディタで確認
次は、
$ od -h a.csv > a.txt
$ od -h b.csv > b.txt
とコードに置き直して、これでdiffってみる。
明らかに途中から違う。
念のため、od -c a.csv なんかで確認すると・・・。¥r ¥n と書いてある。はっ!
気付けば簡単
もうここまでくれば、明らか。
改行コードが違うのだ。
php側では、¥rのみを改行と認識していないため、次行を継続して読み込む。
当然フォーマットが合わないので、アウト。
なぜ、他の環境でエラーにならないのかを検証。
OS | Office | csv改行コード |
Windows7 | Excel 2013 | CR+LF |
Mac OS X Yosemite | Excel 2011 | CR |
そう、Mac 上のExcelはLegacyな改行コードを吐いてくれるということが分かった。
読み込みは、どちらの改行コードでもOKなのに…。
お仲間は、Windows上のExcelで作業しているに違いない。
僕もWindows上のExcelでCSVを吐いていれば、こんなトラブルにも見舞われずに済んだのに。
しかし、Shell上では、UTF-8+LFが今は標準なはず。なのに、ExcelはShift-JIS+CRって、いつの時代で止まってんだよ。
もっと早く気づくべきなのに、疲れているせいでしょうか…。
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。