2011-12-01 6 views

Respuesta

4

¿Por qué no simplemente usar manejadores de archivos y hacer como en this question? Es simple, rápido y muy eficiente.

Si es absolutamente necesario utilizar SPL, puede hacerlo de esta manera

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

He usado fopen/fgets forma tradicional de leer archivos como lo recomienda, gracias. A veces solo trato de hacer todo con las clases cuando no es necesario. –

+0

Si desea realizar su gestión de archivos de forma orientada a objetos, es exactamente por eso que existe SPL. –

+4

También hay ['iterator_count()'] (http://php.net/iterator_count). – salathe

3

El SplFileObject ofrece una itertor, una iteración por línea:

$numberOfLines = iterator_count($file); 

La función iterator_count es su amigo aquí, haciendo el recorrido por usted y devolviendo el número de iteraciones.

Puede hacer uso del objeto del archivo SKIP_EMPTY flag para no contar las líneas vacías en ese archivo.

+0

Excelente respuesta, pero en un archivo más grande (10mb y 135,000+ líneas en este caso) es demasiado lento y un intento de contar el uso de este método resulta en un tiempo de espera. – Typo

33

iterator_count y iterar línea por línea usando next() está roto en mi versión php 5.3.7 en Ubuntu.

También parece roto el método fseek([any offset], SEEK_END). key() devuelve 0.

Iterar archivos grandes usando seek($lineCount) es demasiado lento.

simpliest manera 5.3.7-verificada es

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

Contando 30000 líneas requiere ahora 0,00002 segundos y cuesta alrededor de 20 KB de memoria.

El método de Iteraciones dura unos 3 segundos.

+0

esto está mal, seek() buscará el número de línea, mientras que getSize() devolverá el tamaño del archivo en bytes. – Twisted1919

+1

Lo sé. Solo garantiza que buscamos __all__ líneas de archivo (incluso si todas están vacías). En la mayoría de los casos, seek() se moverá a EOF en el número de línea que definitivamente cuenta menos que los bytes, pero PHP lo maneja silenciosamente, devolviendo el último número de línea. De acuerdo, es un truco sucio, pero no encontré ninguna forma "limpia" de contar líneas rápidamente. –

+0

funciona bien. Pero el archivo tiene 99 líneas pero devuelve 98. ¿sabes por qué? – Bala

12

Estoy de acuerdo con Николай Конев sobre el uso de seek function es mucho más rápido que ir a través de todo el archivo línea por línea, pero como Twisted1919 dijo utilizando el tamaño de archivo para buscar la última línea es confundir lo que mi sugerencia es usar PHP_INT_MAX en lugar del tamaño del archivo :

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