PHP

Windows環境でCSVのパースをするとカラムが正しく分割できない現象の修正方法

現在、副業でPHPでWebサイトの修正を行っているのですが、Goodby CSVで少し不思議な現象があったのでメモがてら残しておこうと思います。

環境と現象

この現象が発生する条件ですがWindows環境のみと思われます。
Windows10
PHP 7.4

LaravelでWebアプリケーションを作っているときに発生しましたが、Laravelは関係ないです。そしてGoodby CSVもあんまり関係ないです。
現象はCSV内のセパレーター文字(カンマ)で一部の文字列が含まれる行の場合、うまくカンマで分割できないことがあります。

再現方法

非常に簡単でCSVに特定の文字列が含まれる場合に再現することができます。
例えば以下のようなCSVファイルです。

id,予定,有効
1,出勤,true
2,休暇,true

このCSVの場合1行目のヘッダー行は3項目になってほしいのですが、実際には2項目になってしまいます。


array:2 [
0 => "id"
1 => "予定,有効" // 正しく分割できていない
]

対応方法

WindowsのPHP環境だとUTF-8のロケールはうまく読み込めないらしく、UTF-8以外のロケールを設定する必要があるみたいです。
むむっ、何を言っているのかよくわからないのですが、そういうことらしいです。
そんなことがあり得るのか・・・と思いましたが、本当みたいです。


if (0 === strpos(PHP_OS, 'WIN')) {
setlocale(LC_CTYPE, 'C');
}

 

まとめ

MicrosoftがビルドしていたWindows版PHPも7.4でサポート終了ということで、PHP8以降はサポートされないみたいなので、今後必要になることはないかもしれません。
すでに稼働しているWindowsでPHPを動かしているWebアプリケーションのメンテナンスなどで、もしかしたら対応しなければならないことがあるかもしれないので、参考になると幸いです。

参考サイト

参考にさせていただきました。
ありがとうございます。

Windows版php-7.1 で UTF8 の CSV をパースする
SplFileObjectのCSV処理について

-PHP

© 2022 ビー鉄のブログ Powered by AFFINGER5