Question

Le plus proche que je l'ai vu dans la documentation PHP, est à fread () une longueur donnée, mais qui ne marche pas préciser quelle ligne de départ. Toutes les autres suggestions?

Était-ce utile?

La solution

Vous n'allez pouvoir lire à partir de la ligne X parce que les lignes peuvent être de longueur arbitraire. Donc, vous devrez lire dès le début compter le nombre de lignes lues pour se rendre à la ligne X. Par exemple:

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

Autres conseils

Oui, vous pouvez le faire facilement avec SplFileObject::seek

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

Ceci est une méthode de l'interface SeekableIterator et ne pas être confondu avec fseek.

Et parce que SplFileObject est itérables vous pouvez le faire encore plus facile avec un LimitIterator :

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

Encore une fois, ceci est basé sur zéro, il est donc ligne 1001-2001.

Malheureusement, afin de pouvoir lire de la ligne x à la ligne y, vous auriez besoin pour être en mesure de détecter les sauts de ligne ... et vous auriez à parcourir tout le fichier. Cependant, en supposant que vous êtes pas poser des questions sur cela pour des raisons de performances, vous pouvez obtenir des lignes à x y ce qui suit:

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

Voir: array_slice

J'avais peur de ça ... Je suppose que ce plan B alors: S

Pour chaque requête AJAX Je vais:

  1. Lire dans une chaîne le nombre de lignes que je vais revenir au client.
  2. Copier reste du fichier dans un fichier temporaire.
  3. chaîne de retour au client.

Il est boiteux, et il sera probablement assez lent avec 10,000+ fichiers lignes, mais je pense qu'il vaut mieux que la lecture même encore et encore, au moins le fichier temporaire devient plus court avec toutes les demandes ... Non?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top