web-dev-qa-db-ja.com

テキストファイルを1行ずつphpで読み取る-改行が検出されない

テキストファイルを取得し、各行をテーブル内の独自の行としてリストする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>');
    }       
}
33
TaRDy
32
alphazero

file() の何が問題になっていますか?

foreach (file($fileName) as $name) {
    echo('<tr><td align="center">'.$name.'</td></tr>');
}
11
jmucchiello

fgets のmanページから:

注:PHPがMacintoshコンピューターで作成または作成されたファイルを読み取るときに行末を正しく認識しない場合、 auto_detect_line_endings ランタイム構成オプションを有効にすると解決に役立つ場合があります問題。

また、 file 関数を試しましたか?配列を返します。配列内の各要素は、ファイル内の行に対応しています。

編集:php.iniにアクセスできない場合、どのWebサーバーを使用していますか? Apacheでは、PHP設定を 。htaccessファイル を使用して変更できます。実行時に設定を変更できる ini_set 関数もあります。

6
Ayman Hourieh

これは、改行問題の典型的なケースです。

ASCIIは、いくつかの異なる「改行」文字を定義します。私たちが気にする2つの具体的なものは、ASCII 10(ラインフィード、LF)と13(キャリッジリターン、CR)です。

OS X、Linuxなどを含むすべてのUnixベースのシステムは、LFを改行として使用します。MacOS Classicは、異なるためにCRを使用し、WindowsはCR LF(そうです、改行用の2文字-誰もWindowsが好きではないのですか?冗談です)。

したがって、Mac上の誰かからのテキストファイル(最新のOSであると仮定)はすべて、行末としてLFを持ちます。Windowsでそれらを読み取ろうとしている場合、WindowsはCR LFを期待します 既に述べた that PHPはこの混乱を整理する能力を持っているが、もし望むなら、ここにあるメモリを大量に消費するソリューション:

_$file = file_get_contents("filename");
$array = split("/\012\015?/", $file); # won't work for Mac Classic
_

もちろん、file()既に述べたように )でも同じことができます。

5
Chris Lutz