Comment puis-je ouvrir un fichier de la ligne X à la ligne Y en PHP?
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?
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
Si vous cherchez des lignes alors vous ne pouvez pas utiliser fread parce que repose sur un décalage d'octet, et non le nombre de sauts de ligne. Vous avez fait de lire le fichier pour trouver les sauts de ligne, donc une autre fonction est plus appropriée. fgets lit le fichier ligne par ligne. Jetez que dans une boucle et capturer uniquement les lignes que vous voulez.
J'avais peur de ça ... Je suppose que ce plan B alors: S
Pour chaque requête AJAX Je vais:
- Lire dans une chaîne le nombre de lignes que je vais revenir au client.
- Copier reste du fichier dans un fichier temporaire.
- 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?