テキストファイルを1行ずつ読み込む-改行が検出されない
-
03-07-2019 - |
質問
テキストファイルを取得し、各行をテーブル内の独自の行としてリストするphp関数を作成しました。
問題は古典的な「私のマシンでは問題なく動作します」ですが、もちろん他の人に私が探している.txtファイルを生成するように頼むと、ファイル全体を1行として読み続けます。テキストエディタで開くと、各行に新しい名前が付けられているのと同じように見えますが、改行文字または何かがスローされます。
これまでのところ、Macシステムで使用しているテキストエディタと関係があるかもしれないという結論に達しました。
これは理にかなっていますか?そして、テキストエディタが新しい行として認識しているこの文字を単に検出し、phpが認識する標準の行に置き換える簡単な方法はありますか?
更新:次の行を追加することで問題が解決しました。
ini_set('auto_detect_line_endings',true);
機能:
function displayTXTList($fileName) {
if(file_exists($fileName)) {
$file = fopen($fileName,'r');
while(!feof($file)) {
$name = fgets($file);
echo('<tr><td align="center">'.$name.'</td></tr>');
}
fclose($file);
} else {
echo('<tr><td align="center">placeholder</td></tr>');
}
}
他のヒント
file()
の問題点
foreach (file($fileName) as $name) {
echo('<tr><td align="center">'.$name.'</td></tr>');
}
fgets のmanページから:
注:Macintoshコンピューターで作成したファイルまたはMacintoshコンピューターで作成したファイルを読み込むときにPHPが行末を正しく認識しない場合は、 auto_detect_line_endings 実行時設定オプションが問題の解決に役立つ場合があります。
また、 file 関数を試しましたか?配列を返します。配列の各要素はファイルの行に対応しています。
編集:php.iniにアクセスできない場合、どのWebサーバーを使用していますか? Apacheでは、 .htaccessファイルを使用してPHP設定を変更できます。実行時に設定を変更できる ini_set 関数もあります。
これは、改行問題の典型的なケースです。
ASCIIは、いくつかの異なる&quot; newline&quot;を定義します。文字。私たちが関心を持っているのは、ASCII 10(ラインフィード、LF)と13(キャリッジリターン、CR)です。
OS X、Linuxなどを含むすべてのUnixベースのシステムは、LFを改行として使用します。 Mac OS ClassicはCRを異なるものとして使用し、WindowsはCR LF(改行に2文字を使用します。なぜWindowsが好きではないのか、冗談です)を改行として使用します。
したがって、Mac上の誰かからのテキストファイル(最新のOSであると仮定)には、すべて行末としてLFがあります。 Windowsでそれらを読み取ろうとしていて、WindowsがCR LFを予期している場合、それは見つかりません。今、持っていますPHPにはこの混乱を整理する機能があることが既に言及されていますが、必要に応じて、メモリを大量に消費するソリューションを次に示します。
$file = file_get_contents("filename");
$array = split("/\012\015?/", $file); # won't work for Mac Classic
もちろん、 file()
(既に述べたとおり)。