PHPでの読み取りに別の行終端を使用するにはどうすればよいですか?
-
06-07-2019 - |
質問
LinuxでM $ Excelによって生成されたCSVファイルを読み取ろうとしています。
ファイルには、引用符で囲まれた複数行(x0Aで区切られた)列と0x0d0a行の終了があります。
Linux上のPHPは0x0aを行末記号として使用するため、すべての行ベースのツール(file、fgets、fgetcsv)は、データセルの中央にレコードブレークがあると考えています。
ファイルをバイト単位で処理する短いですが、PHPの行末文字(PHP_EOL定数)を一時的に変更して、ファイルを簡単に解析できるようにします。
Perlで" $ \"を使用して実行できると思います。 PHPに似たようなものがありますか?
バイト単位で解析できることはわかっていますが、よりクリーンなアプローチを探しています。
解決
conceptDawgの auto_detect_line_endings
の提案が機能しない場合は、 file_get_contents ()を呼び出してから explode ()を使用して、ファイルを複数行に分割します。 explode()
他のヒント
「 auto_detect_line_endings
」ランタイム設定オプションを使用してみてください。これを使用すると、正しい行末が自動的に把握されるという。ドキュメントから:
オンにすると、PHPはfgets()およびfile()によって読み取られたデータを調べて、Unix、MS-Dos、またはMacintoshの行末規則を使用しているかどうかを確認します。
これにより、PHPはMacintoshシステムと相互運用できますが、最初の行のEOL規則を検出する際のパフォーマンスの低下が非常に小さく、Unixシステムで項目区切り文字としてキャリッジリターンを使用しているため、下位互換性のない動作が発生します。
それでもうまくいかない場合は、ファイル全体を常にメモリに読み込み(ファイルサイズによっては実行できない場合があります)、問題の文字に対してpreg_replaceを実行し、"正しい"に置き換えます。文字。