Pregunta

Lo más cerca que he visto en la documentación de PHP, es a fread () una longitud dada, pero eso no especifica qué línea para empezar. ¿Alguna otra sugerencia?

¿Fue útil?

Solución

Usted no va a ser capaz de leer a partir de la línea X porque las líneas pueden ser de longitud arbitraria. Por lo que tendrá que leer desde el principio contando el número de líneas de leer para llegar a la línea X. Por ejemplo:

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);

Otros consejos

Sí, puede hacerlo fácilmente con SplFileObject::seek

$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
    echo $file->current(); 
    $file->next();
}

Este es un método de la href="http://de.php.net/manual/en/class.seekableiterator.php" rel="noreferrer"> SeekableIterator interfaz fseek.

Y porque SplFileObject es iterable que puede hacer que sea aún más fácil con un LimitIterator :

$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
}

Una vez más, esto está basado en cero, por lo que es la línea 1001-2001.

Por desgracia, con el fin de ser capaz de leer desde la línea x para línea Y, lo que se necesita para ser capaz de detectar los saltos de línea ... y tendría que buscar a través de todo el archivo. Sin embargo, asumiendo que usted está no preguntar sobre esto por razones de rendimiento, puede obtener líneas x a y con lo siguiente:

$x = 10; //inclusive start line
$y = 20; //inclusive end line
$lines = file('myfile.txt');
$my_important_lines = array_slice($lines, $x, $y);

Ver: array_slice

Aquí está la solución posible :)

<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
    $lineNo++;
    if ($lineNo >= $startLine) {
        echo $line;
    }
    if ($lineNo == $endLine) {
        break;
    }
}
fclose($f);
?>

Bueno, no se puede utilizar la función fseek para buscar la posición adecuada, ya que funciona con determinado número de bytes.

Creo que no es posible sin algún tipo de caché o ir a través de líneas uno tras otro.

Si usted está buscando para las líneas entonces no se puede utilizar porque fread que se basa en un desplazamiento, no el número de saltos de línea de bytes. De hecho tienes que leer el archivo para encontrar los saltos de línea, por lo que una función diferente es más apropiado. fgets leerá la línea por línea en archivos. El tiro que en un bucle y capturar sólo las líneas que desea.

Me lo temía ... supongo que es el plan B a continuación: S

Para cada solicitud AJAX Voy a:

  1. Leer en una cadena el número de líneas que voy a volver al cliente.
  2. Copia el resto del archivo en un archivo temporal.
  3. cadena devuelta al cliente.

Es cojo, y es probable que sea bastante lento, con más de 10.000 archivos de líneas, pero supongo que es mejor que la lectura de la misma una y otra vez, al menos el archivo temporal se hace más corto con cada petición ... ¿No?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top