2011-12-01 15 views

答えて

4

なぜ単にファイルハンドラを使用せず、this questionのようにするのはなぜですか?そのシンプルで、速く、非常に効率的です。あなたは絶対にSPLを使用する必要がある場合

、あなたはこのよう

$file = new SplFileObject("/path/to/file.txt"); 
$i = 0; 
while (!$file->eof()) { 
    $i++; 
    $file->next(); 
} 
print "file has " . $i . " lines"; 
+0

fopen/fgetsの伝統的な方法でファイルを読んでみました。ありがとうございました。時には私はクラスで必要なときにすべてをやろうとしています。 –

+0

オブジェクト指向の方法でファイル処理を行いたいのであれば、SPLが存在する理由はまさにその通りです。 –

+4

[iterator_count() '](http://php.net/iterator_count)もあります。 – salathe

3

を行うことができますSplFileObjectがitertorを提供しています、1行に1つの反復:

$numberOfLines = iterator_count($file); 

機能iterator_countはここにあなたの友人です、あなたのためにトラバースを行い、反復回数を返します。

ファイルオブジェクトのSKIP_EMPTY flagを使用して、そのファイルの空行を数えないようにすることができます。

+0

偉大な答えですが、大容量のファイル(この場合は10MBと135,000+のライン)では、速度が完全に遅すぎます。この方法を使用してカウントすると、実際にタイムアウトになります。 – Typo

33

iterator_countnext()を使用した行単位の繰り返しは、私の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秒かかります。

+0

これは間違っていますが、getSize()はバイト単位のファイルサイズを返しますが、seek()は行番号を探します。 – Twisted1919

+1

私は知っています。 __all__ファイル行を探していることが保証されています(すべてが空であっても)。 多くの場合、seek()は行数のバイト数よりも少ないEOFにバンプしますが、PHPはそれを静かに処理して最後の行番号を返します。 同意すると、それは汚れたハックですが、すぐに行を数えるための「クリーン」な方法は見つかりませんでした。 –

+0

は問題なく動作します。しかし、ファイルは99行ですが、それは98を返します。あなたはその理由を知っていますか? – Bala

12

私はseek functionを使用してНиколай Коневに同意するには、行によって、ファイル全体のラインを経由するよりもはるかに高速ですが、Twisted1919は最後の行を追求するために、ファイルのサイズを使用して言ったように私の提案ではなく、ファイルサイズのPHP_INT_MAXを使用しているので、混乱しています: