Wie öffne ich eine Datei von der Linie X-Y in PHP Zeile?
Frage
Die nächstgelegene ich in der PHP-Dokumentation gesehen habe, ist zu fread () eine bestimmte Länge, aber das tut angeben, welche Linie aus zu starten. Alle anderen Vorschläge?
Lösung
Sie gehen zu können, nicht ausgehend von der Linie X lesen, weil Linien beliebiger Länge sein können. So werden Sie haben von Anfang an lesen Zählen die Anzahl der Zeilen auf Linie X erhalten liest Zum Beispiel:
<?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);
Andere Tipps
Ja, können Sie das tun einfach mit SplFileObject::seek
$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
echo $file->current();
$file->next();
}
Dies ist eine Methode aus dem SeekableIterator Schnittstelle und nicht zu sein verwechseln mit fseek
.
Und weil SplFileObject iterable ist, können Sie es sogar einfacher, mit einem tun LimitIterator
:
$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
echo $line, PHP_EOL;
}
Auch dies ist nullbasiert, es ist also Linie 1001-2001.
Leider, um der Lage sein, von der Linie x zu lesen y auszukleiden, würden Sie in der Lage sein müssen Linie erkennen, bricht ... und Sie würden durch die gesamte Datei zu scannen haben. Aber vorausgesetzt, Sie sind nicht über diese aus Performance-Gründen zu fragen, können Sie sich Linien x
mit dem folgenden y
:
$x = 10; //inclusive start line
$y = 20; //inclusive end line
$lines = file('myfile.txt');
$my_important_lines = array_slice($lines, $x, $y);
Siehe auch: array_slice
Wenn Sie suchen Linien, dann können Sie nicht fread verwenden, weil das auf einem Byte beruht versetzt, nicht die Anzahl der Zeilenumbrüche. Sie haben tatsächlich die Datei zu lesen, die Zeilenumbrüche zu finden, also eine andere Funktion ist besser geeignet. fgets wird die Datei Zeile-für-Zeile gelesen. Werfen Sie, dass in einer Schleife und erfassen nur die Zeilen, die Sie wollen.
Ich habe Angst, dass ... Ich denke, es Plan B ist dann: S
Für jede AJAX Anfrage werde ich:
- Lesen Sie in eine Zeichenfolge die Anzahl der Zeilen, die ich an den Client zurück werde.
- Kopieren Sie die Rest der Datei in eine temporäre Datei.
- Return-String an den Client.
Es ist lahm, und es wird wahrscheinlich ziemlich langsam mit 10.000+ Linien Dateien sein, aber ich denke, es ist besser als das gleiche immer und immer wieder zu lesen, zumindest die temporäre Datei wird bei jeder Anfrage kürzer wird ... Nein?