540

ファイルを 1 行ずつ読みたいのですが、メモリに完全にロードする必要はありません。

ファイルが大きすぎてメモリで開くことができません。開こうとすると、常にメモリ不足エラーが発生します。

ファイルサイズは1GBです。

4

14 に答える 14

781

関数を使用してfgets()、ファイルを 1 行ずつ読み取ることができます。

$handle = fopen("inputfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // process the line read.
    }

    fclose($handle);
} else {
    // error opening the file.
} 
于 2012-11-06T07:51:30.540 に答える
137
if ($file = fopen("file.txt", "r")) {
    while(!feof($file)) {
        $line = fgets($file);
        # do same stuff with the $line
    }
    fclose($file);
}
于 2012-11-06T07:55:24.480 に答える
31

バッファリング技術を使用してファイルを読み取ります。

$filename = "test.txt";
$source_file = fopen( $filename, "r" ) or die("Couldn't open $filename");
while (!feof($source_file)) {
    $buffer = fread($source_file, 4096);  // use a buffer of 4KB
    $buffer = str_replace($old,$new,$buffer);
    ///
}
于 2012-11-06T08:23:30.883 に答える
8

「while(!feof ... fgets()」に注意してください。fgets はエラー (false を返す) を取得し、ファイルの最後に到達することなく永遠にループする可能性があります。ループが終了したら、feof をチェックしてください。そうでない場合は、エラーが発生しています。

于 2014-01-28T21:14:06.160 に答える
7

この質問に対する一般的な解決策の 1 つは、改行文字に関する問題です。シンプルな方法で簡単に修正できますstr_replace

$handle = fopen("some_file.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $line = str_replace("\n", "", $line);
    }
    fclose($handle);
}
于 2015-07-19T01:18:15.563 に答える
-9

配列を返す関数

function read_file($filename = ''){
    $buffer = array();
    $source_file = fopen( $filename, "r" ) or die("Couldn't open $filename");
    while (!feof($source_file)) {
        $buffer[] = fread($source_file, 4096);  // use a buffer of 4KB
    }
    return $buffer;
}
于 2014-03-17T16:19:15.453 に答える