Excelで作ったcsvファイルが行ロード出来ない
という問題
Excelで作ったcsvをphpで行ロード(fgetcsvとか)しようとすると改行コードを認識せずなんだかすごい事になっていた
当たり前である
なんせ実行機はMacだったのだから。。。
さて、CRとLFによって改行コードはあらわされるわけですが、機種によって改行コードは異なります。 改行コード 使用機種 LF UNIX系OS CR マッキントッシュ CR+LF Windows(MS-DOSやWindowsNTも同様です) OSによって、改行コードが異なるので、クライアントのOSを限定できないWebプログラミングでは、注意が必要になります。
改行コードの話より引用
通常、ブラウザなんかで見る場合
改行コードのギャップはブラウザが埋めてくれる
が、こーいった代物の場合は自力で埋めなければならない
なんせ、そーいった便利なシステムを作る側な訳だからだ
という訳で、こういったファイルアップで動くシステムの場合は改行コードに注意しておかなければならない
変換とかして統一すればイインデネーノ
と思ったがこんなオプションを見つけた
auto_detect_line_endings boolean onにした場合、PHPは fgets() および file() により読み込まれたデータを評価し、UNIX、MS-DOS、Machintoshの行末表記を使用しているかどうかを調べます。 これにより、PHPがMacintoshシステムと相互運用できるようになりますが、 デフォルトはOffとなっています。これは、最初の行の行末表記を検出する際にごく僅かな性能劣化があるためと、UNIXシステムのもとで復改文字を項目セパレータとして使用している人が従来のバージョンと互換性がない動作であると感じる可能性があるためです。 注意: この設定オプションは、PHP 4.3で追加されました。
PHP: 実行時設定 - Manualより引用
php.iniで設定されてる項目でこのギャップを自動で修正してくれるオプションがあった
デフォではoffになってるが、この問題に対応したくonにしても問題ないならこれで改行問題は気にしなくてよくなる
言うまでもないがiniを編集したくないなら以下の構文で制定出来る
ini_set("auto_detect_line_endings", true);
が、所詮は付け焼き刃なので改行変換して統一するべき何じゃないだろうか
でもさ、その場合ってどの改行コードにするのが一般的なんだろうね?
ちなみにfgetcsvだけれども、この関数はSJISにすごく弱いらしい
おのれSJIS。これ作った人はすごいと思うがいかんせん向いてない事が多すぎる
詳しい事はググって調べると色々出てくる。
まぁ、素直に行ロードして指定区切りで分けるとよろし