xampp環境におけるphpのfgetcsv()について

IT

バグにハマってて色々気になったのでメモしておきます。

Excelで作成したcsvファイルを読み込ませようとするとカラム数が変化していて処理に失敗するというバグが発生し調査しました。

原因

調べてみると、Asciiコードの,にあたる0x2cの二進数 101100に含まれる1011がどこかで使われるshift-jisの文字をなぜか,として処理しているようです。(例 生 下8bitが10110110)

なぜこうなるのかはいいとして、どうもshift jisのファイルを処理するときに""(ダブルクォーテーション)を勝手に削除したり付けなおしたりしてしまっているようです。

shift jis以外はダブルクォーテーションが無くても誤作動を起こすことは無いのですが、なぜかshift jisは必須のようです。

で、悪いことにExcelでcsvファイルを開くと""を勝手に削除します。

(厳密には、特定のルールに従って削除したり追加したりしているようです。)

その結果として、特定の文字列を入力するとデリミタとして処理されてしまい、誤作動を引き起こしているようでした。

対処法

パワー系対処方としては、すべての行に"を追加すれば何とかなります。

'"'.str_replace('.','","',文字列).'"';

とかしておけば何とかなりそうです。

Excelの謎ルールによって""が付与されてしまう場合を考慮していないので、その辺は自分でなんとかしてください。

どんなところで発生するの?

学習管理ソフトMoodleでcsvを取り扱う際に発生しました。

Excelしかないとこうなってしまう。

広告

IT

Posted by 黒生野 からす