10
$file = new SplFileObject('/path/to/file.txt');

でファイルの行数を見つけるにはどうすればよいSplFileObjectですか?

4

4 に答える 4

43

iterator_countnext()また、Ubuntuのphpバージョン5.3.7では、行ごとの反復使用が壊れています。

また、壊れたfseek([any offset], SEEK_END)方法のようです。key()0を返します。

を使用して大きなファイルを反復処理するのseek($lineCount)は遅すぎます。

最も単純な5.3.7-検証された方法は

// force to seek to last line, won't raise error
$file->seek($file->getSize());
$linesTotal = $file->key();

30000行をカウントするには、0.00002秒が必要で、約20kbのメモリが必要です。

反復法は約3秒かかります。

于 2012-10-25T02:24:24.163 に答える
18

НиколайКоневの使用seek functionは、ファイル全体を1行ずつ調べるよりもはるかに高速であることに同意しますが、 Twisted1919が言ったように、ファイルサイズを使用して最後の行を探すのは混乱するため、ファイルサイズの代わりにPHP_INT_MAXを使用することをお勧めします。

// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();
于 2013-11-16T22:33:07.857 に答える
6

SplFileObject、1行に1回の反復で、反復子を提供します。

$numberOfLines = iterator_count($file);

この関数iterator_countはここでの友達であり、トラバーサルを実行して反復回数を返します。

ファイルオブジェクトのSKIP_EMPTYフラグを利用して、そのファイルの空の行をカウントしないようにすることができます。

于 2012-10-20T15:01:06.823 に答える
4

単にファイルハンドラーを使用して、この質問のようにしないのはなぜですか?そのシンプルで高速かつ非常に効率的です。

どうしてもsplを使用する必要がある場合は、次のように実行できます

$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
    $i++;
    $file->next();
}
print "file has " . $i . " lines"; 
于 2011-12-01T14:58:07.560 に答える