Domanda

Il più vicino che ho visto nella documentazione di PHP, è quello di fread () una determinata lunghezza, ma quello non specificano quale linea di partenza. Altri suggerimenti?

È stato utile?

Soluzione

Non sarà in grado di leggere a partire dalla linea X perché le linee possono essere di lunghezza arbitraria. Così si dovrà leggere dall'inizio contando il numero di linee di lettura per arrivare alla linea X. Per esempio:

<?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);

Altri suggerimenti

Sì, si può fare facilmente con SplFileObject::seek

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

Questo è un metodo dalla href="http://de.php.net/manual/en/class.seekableiterator.php" rel="noreferrer"> SeekableIterator interfaccia fseek.

E poiché SplFileObject è iterabile si può fare ancora più facile con un LimitIterator :

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

Ancora una volta, questo è a base zero, quindi è la linea 1001-2001.

Purtroppo, al fine di essere in grado di leggere da linea a linea x y, avresti bisogno di essere in grado di rilevare le interruzioni di linea ... e dovresti eseguire la scansione attraverso l'intero file. Tuttavia, supponendo che si sta non che chiede a questo per motivi di prestazioni, è possibile ottenere linee x al y con il seguente:

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

Si veda: array_slice

Ecco la soluzione possibile :)

<?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);
?>

Beh, non è possibile utilizzare la funzione fseek per cercare la posizione appropriata perché funziona con determinato numero di byte.

Credo che non è possibile senza una sorta di cache o passare attraverso le linee uno dopo l'altro.

Se siete alla ricerca di linee, allora non è possibile utilizzare fread perché si basa su un offset, non il numero di interruzioni di riga di byte. In realtà si deve leggere il file per trovare le interruzioni di riga, quindi una funzione diversa è più appropriato. fgets leggerà la linea linea per file. Gettare che in un ciclo e catturare solo le linee che si desidera.

avevo paura di che ... Credo che sia il piano B quindi: S

Per ciascuna richiesta AJAX ho intenzione di:

  1. Leggi in una stringa il numero di linee che ho intenzione di tornare al client.
  2. Copiare il resto del file in un file temporaneo.
  3. stringa di ritorno al cliente.

E 'zoppo, e probabilmente sarà piuttosto lento con 10.000 file linee, ma credo che sia meglio che leggere lo stesso più e più volte, almeno il file temporaneo è sempre più breve con ogni richiesta ... No?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top