$file = new SplFileObject('/path/to/file.txt');
SplFileObject
でファイルの行数を調べるにはどうすればよいですか?SplFileObjectで行数を取得する方法は?
$file = new SplFileObject('/path/to/file.txt');
SplFileObject
でファイルの行数を調べるにはどうすればよいですか?SplFileObjectで行数を取得する方法は?
なぜ単にファイルハンドラを使用せず、this questionのようにするのはなぜですか?そのシンプルで、速く、非常に効率的です。あなたは絶対にSPLを使用する必要がある場合
、あなたはこのよう
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";
を行うことができますSplFileObject
がitertorを提供しています、1行に1つの反復:
$numberOfLines = iterator_count($file);
機能iterator_count
はここにあなたの友人です、あなたのためにトラバースを行い、反復回数を返します。
ファイルオブジェクトのSKIP_EMPTY
flagを使用して、そのファイルの空行を数えないようにすることができます。
偉大な答えですが、大容量のファイル(この場合は10MBと135,000+のライン)では、速度が完全に遅すぎます。この方法を使用してカウントすると、実際にタイムアウトになります。 – Typo
iterator_count
とnext()
を使用した行単位の繰り返しは、私のPHPバージョン5.3.7のUbuntuで壊れています。
また、壊れているようですfseek([any offset], SEEK_END)
メソッド。 key()
は0を返します。
seek($lineCount)
を使用して大きなファイルを反復するのが遅すぎます。
最も単純5.3.7-検証方法は、30000行を数える
// force to seek to last line, won't raise error
$file->seek($file->getSize());
$linesTotal = $file->key();
は今0.00002秒を必要とし、メモリのおよそ20キロバイトを要するています。
反復法には約3秒かかります。
これは間違っていますが、getSize()はバイト単位のファイルサイズを返しますが、seek()は行番号を探します。 – Twisted1919
私は知っています。 __all__ファイル行を探していることが保証されています(すべてが空であっても)。 多くの場合、seek()は行数のバイト数よりも少ないEOFにバンプしますが、PHPはそれを静かに処理して最後の行番号を返します。 同意すると、それは汚れたハックですが、すぐに行を数えるための「クリーン」な方法は見つかりませんでした。 –
は問題なく動作します。しかし、ファイルは99行ですが、それは98を返します。あなたはその理由を知っていますか? – Bala
私はseek function
を使用してНиколай Коневに同意するには、行によって、ファイル全体のラインを経由するよりもはるかに高速ですが、Twisted1919は最後の行を追求するために、ファイルのサイズを使用して言ったように私の提案ではなく、ファイルサイズのPHP_INT_MAXを使用しているので、混乱しています:
fopen/fgetsの伝統的な方法でファイルを読んでみました。ありがとうございました。時には私はクラスで必要なときにすべてをやろうとしています。 –
オブジェクト指向の方法でファイル処理を行いたいのであれば、SPLが存在する理由はまさにその通りです。 –
[iterator_count() '](http://php.net/iterator_count)もあります。 – salathe