$file = new SplFileObject('/path/to/file.txt');
でファイルの行数を見つけるにはどうすればよいSplFileObject
ですか?
iterator_count
next()
また、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秒かかります。
НиколайКоневの使用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();
はSplFileObject
、1行に1回の反復で、反復子を提供します。
$numberOfLines = iterator_count($file);
この関数iterator_count
はここでの友達であり、トラバーサルを実行して反復回数を返します。
ファイルオブジェクトのSKIP_EMPTY
フラグを利用して、そのファイルの空の行をカウントしないようにすることができます。
単にファイルハンドラーを使用して、この質問のようにしないのはなぜですか?そのシンプルで高速かつ非常に効率的です。
どうしてもsplを使用する必要がある場合は、次のように実行できます
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";