Zeilenvorschub beim Parsen (PHP)

Nagilo

Mitglied
Erstmal sorry, daß ich schon wieder ein neues Thema anfange.

Wie schon beim anderen Thema geht es um das Parsen von Log-Files.
Wenn ich über eine Information in einer Zeile herausgefunden habe, daß z.B. die nächsten 30 Zeilen uninteressant sind, möchte ich diese gern überspringen.

Es gibt zwar einen PHP Befehl fseek(). Mit diesem kann ich aber nur mit einer Byte-Angabe vorwärts gehen. Leider weiß ich ja vorher nicht wieviel Bytes die nächsten 30 Zeilen genau haben.
Bisher muß ich daher die 30 Zeilen stets einlesen und dann einfach ignorieren.

Gibt es eine Möglichkeit PHP beizubringen genau zeilenweise den Dateizeiger vorzubewegen und dabei die Länge der nächsten Zeile zu vernachlässigen?

Vielen Dank schonmal

Matthias
 
Meinem Erinnerungsvermögen nach,... *grübel* *wühl*

PHP.net:
PHP:
$handle = fopen ("/tmp/inputfile.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}
fclose ($handle);

fgets()

Steht ganz oben, erstes Code-Beispiel...

Daran kannst du es ja alles berechnen.
 
nein das geht nicht, seeking in files geht immer nur mit bytezahlen, weil sonst müsste er die daten ja lesen was zu einer zeiverzögerung führt bei großen dateien.
Stell dir vor du hast ne 1GB große video datei und willst dir die letzten minuten angucken und er muss erst die restlichen 900MB von Platte lesen bevor er da is...
das dauert

aber du kannst bei kleinen schritten fgets benutzen um die zeilen zu lesen, und dann lieste die daten eben nach /dev/null.
PHP:
function seekLines($lines) {
    for($i = 0; $i < $lines; $i++) {
        fgets($fp, 1024 /*eine zeile is maximal 1024 byte groß*/);
    }
}


[edit] ups da war wohl jemand n stück schneller.
 
Danke für die super schnelle Antwort, aber leider ist das nichts neues. Bisher mache ich genau das was ihr geschrieben habt, aber genau das ist das Problem. Die Zeilen mit fgetc oder fgets einzulesen, obwohl sie uninteressant sind, ist ja gerade das Performance-Problem.

Das Beispiel mit der Video-Datei ist gut, aber da weiß man ja auch wieviele Bytes man vorspringen muß. Bei einem Logfile, wo mir ein Header nur sagt, daß jetzt 33 Zeilen von irgendwas kommen was mich nicht interessiert, sagt mir leider nicht wieviel Bytes diese Zeilen zusammen haben.

fseek kann ich daher nicht benutzen.
 
Du musst immer vorher irgendwie wissen, wo etwas in der Datei ist.
Entweder suchst du es dynamisch raus, oder legst es fest
Wenn in allen Dateien die Position gleich ist, musst du es nur einmal errechnen, dann kannst du es festlegen.

Aber das nur am Rande, wüsste jetzt nicht, ob PHP das bietet, was du möchtest...
 
Leider kann ich die Länge der Zeilen in Bytes nicht im Voraus berechnen, da sie stark variiert.

Ich glaube auch fast, daß PHP keine solche Funktion bietet, aber ich hoffe jemand hat noch ne tolle Idee.
 
Das Beispiel mit der Video-Datei ist gut, aber da weiß man ja auch wieviele Bytes man vorspringen muß.

Ja aber nur wenn die Frametabelle des videos in ordnung ist, ist die deffekt weigern sich viele programme, und die programme dies trotzdem können müssen die ganze datei durchsuchen um ein bestimtes frame zu finden und zwar von anfang an. das kann mitunter minuten dauern bis er weiß wo er hin muss.

Diese Frametabelle ist quasi ein inhaltverzeichnis wo unter anderem drin steht wo das entsprechende frame zu finden ist. und zwar als byteoffset vom beginn der datei.


Wie gesagt wenn du nach bestimten zeichen suchen willst und da hin seeken dann wirds dir nicht erspaart bleiben die zeilen einzulesen, weil wie soll das OS wissen wo es den leseschreib zeiger hin setzen muss und welches stück der datei es laden muss wenn es die daten nicht liest oder eine angabe vom programmierer benutzen.

die einzige alternative dazu ist genau zu kennen wo sich die zeilenumbrüche befinden, was sich entweder mit einem header er bytezahlen dazu angibt oder einer logdatei die auf einer struktur basiert machen läst.

faszit: eine funktion die diese funktionalität hatt und dabei die daten nicht einliest existiert in keiner programmiersprache und wird auch von keinem OS angeboten weil es schon von der hardwareebene unmöglich is.
 
Zuletzt bearbeitet:
Ja aber nur wenn die Frametabelle des videos in ordnung ist, ist die deffekt weigern sich viele programme, und die programme dies trotzdem können müssen die ganze datei durchsuchen um ein bestimtes frame zu finden und zwar von anfang an. das kann mitunter minuten dauern bis er weiß wo er hin muss.

Diese Frametabelle ist quasi ein inhaltverzeichnis wo unter anderem drin steht wo das entsprechende frame zu finden ist. und zwar als byteoffset vom beginn der datei.

Ich hatte mir auch schon überlegt das zu schreiben, aber es war mir dann doch ein Wenig zu Off-Topic ;)

Wenn PCs hellsehen können, können wir ja weiter über dieses Thema disskutieren...

...bis dahin,

ByBy
 
Hallo,

versuch doch mal alle Zeilen gleich lang zu machen.
also mit Leerzeichen auffüllen.

Ja, die werden dann unnötig groß, aber es könnte dir beim springen helfen.

Grtz MRF
 
Hm, ich glaube es ging ihm hierbei grade um die Performance,
wenn er nun die Dateien unnötig mit Spaces auffült, ist das mit Sicherheit keine Verbesserung.
 
Zurück