Bestimmte Zeilen einer Datei einlesen ?
Chris
- php
Hallo zusammen,
ich hab eine Textdatei mit ca. 20 MB Inhalt der Zeilenweise getrennt ist.
Ich möchte den Inhalt der Datei gerne in einen Buffer einlesen um diesen dann in meinen Scripten zu benutzen, allerdings nur bestimmte Zeilen.
Angenommen die Datei hat 1000 Zeilen, ich benötige aber nur Zeile 50-100, damit ist der Rest nur Speichermüll für mich und bei 20 MB nicht tragbar ;-)
Kann mir jemand sagen wie ich den Dateizeiger auf einen bestimmten Bereich der Datei schieben kann, oder geht das mit php nicht ?
Dann noch etwas kleines, würdet Ihr bei der Größe der Datei dazu Raten die Daten in einer Datenbank zu speichern oder macht das keinen Unterschied ?
Dabei geht es mir nicht unbedingt um Geschwindigkeit sondern eher um die Auslastung des Servers ...
Danke für eure Hilfe und viele Grüße
Chris
Hello,
ich hab eine Textdatei mit ca. 20 MB Inhalt der Zeilenweise getrennt ist.
Die 20MB sind kein Problem.
Ich möchte den Inhalt der Datei gerne in einen Buffer einlesen um diesen dann in meinen Scripten zu benutzen, allerdings nur bestimmte Zeilen.
Das geht dann aber (mit Ausnahmen) nur lesend.
Angenommen die Datei hat 1000 Zeilen, ich benötige aber nur Zeile 50-100, damit ist der Rest nur Speichermüll für mich und bei 20 MB nicht tragbar ;-)
Nur mit PHP:
Zähler initialisieren
Datei mit Handle öffnen
mit fgets(...,0) bis vor Startzeile lesen.
mit fgets(...,genügend Zeilenlänge) bis zur Stopzeile die Daten in den Buffer holen
Datei schließen.
Kann mir jemand sagen wie ich den Dateizeiger auf einen bestimmten Bereich der Datei schieben kann, oder geht das mit php nicht ?
s.o.
Dann noch etwas kleines, würdet Ihr bei der Größe der Datei dazu Raten die Daten in einer Datenbank zu speichern oder macht das keinen Unterschied ?
bei einer "geraden" Tabelle, also ohne Relations, sehe ich da nicht unbedingt Bedarf. Allerdings kann man über "echtes" HTTP (also verbindungslos) keine Sätze wirklich löschen, ohne das das System kompliziert (oder langsam) wird. Erklärungen würden hier zu weit führen.
Dabei geht es mir nicht unbedingt um Geschwindigkeit sondern eher um die Auslastung des Servers ...
Ich würde ein Random-Access-File daraus machen.
Ein Beispiel findest Du unter http://selfhtml.bitworks.de --> Adressverwaltung
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
Angenommen die Datei hat 1000 Zeilen, ich benötige aber nur Zeile 50-100, damit ist der Rest nur Speichermüll für mich und bei 20 MB nicht tragbar ;-)
Nur mit PHP:
Zähler initialisieren
Datei mit Handle öffnen
mit fgets(...,0) bis vor Startzeile lesen.
mit fgets(...,genügend Zeilenlänge) bis zur Stopzeile die Daten in den Buffer holen
Datei schließen.
so wie ich das jetzt im Manual gelesen habe liest fgets() eine Zeile mit der angegeben Länge.
Glaube das passt bei mir nicht, weil ich ja nicht eine bestimmten Teil der Zeile, sondern eine bestimmte Zeile haben will ;-)
Oder hab ich das nicht verstanden ?
Datei:
Zeile 1
Zeile 2
Zeile 3
Ich möchte hier jetzt nur Zeile 2 einlesen, weil ich den Rest nicht brauche, dazu müste ich einen Anfangs und eine Endwert setzen können.
Habe da fseek() gefunden, aber da geht es um die Bytes der Datei und nicht um die Zeilen ;-) Woher weiss ich den wieviele Bytes vor meinem Startpunkt liegen, dafür muss ich die Datei doch erst einlesen durchzählen etc ... ;-(
... Danke und Grüße
Chris ;-)
Hello,
Nur mit PHP:
Zähler initialisieren
Datei mit Handle öffnen
mit fgets($fh,genügend Zeilenlänge) bis zur Startzeile die Daten in den Mülleimer leiten
mit fgets(...,genügend Zeilenlänge) bis zur Stopzeile die Daten in den Buffer holen
Datei schließen.so wie ich das jetzt im Manual gelesen habe liest fgets() eine Zeile mit der angegeben Länge.
Glaube das passt bei mir nicht, weil ich ja nicht eine bestimmten Teil der Zeile, sondern eine bestimmte Zeile haben will ;-)
Oder hab ich das nicht verstanden ?
Ja, das hast Du nicht ganz richtig verstanden. Ich habe da aber auch einen Schreibfehler reingetippt.
Datei:
Zeile 1|diese Zeile 2 it länger |Zeile 3 hat auch Daten||die vierte war leer|und in der schsten verdammten Zeole stehen total viele Daten, die will einfach nicht mher aufhören und geht noch ein halbes Jahrhundert so weiter|ist schon merkwürdig, dass Dateien in Wirklichkeit gar keine Zeilen kennen | |Man kann auch Leerzeilen mit Leerzeichen füllen<EOF>
Hier musst Du Dir nun vorstellen, dass | immer das Zeilendendezeichen darstellt und <EOF>das Ende des Files. Das ist aber auch nur bekannt, weil die gültige Länge der Datei im Betriebssystem (Filesystem) vermerkt ist. Denn ein <EOF>-Zeichen gibt es in Wirklichkeit nicht mehr.
Wenn Du also jetzt die Zeilen lesen willst, dann muss das Filesystem im Auftrag des Betriebssystems die Datei Byte für Byte (Cluster für Cluster) einlesen und an die Applikation weiterreichen. PHP bietet hierfür die Möglichkeit, nur immer soviele Daten zu holen, bis das Zeilenende, Das DAteieinde oder die Anzahl Zeichen erreicht sind. Der Dateizeiger steht dann nach jedem fgets() auf dem Anfang der nächsten Zeile, sofern die Zeilenlänge zum Lesen ausreichend hoch eingestellt war.
Ein
$muelleimer = fgets($fh, genügend Bytes )
veranlasst den Dateizeiger also, zum nächsten Zeilenanfang vorzurücken.
Das musst Du dann ur in einer Schleife oft genug wiederholen.
Ich möchte hier jetzt nur Zeile 2 einlesen, weil ich den Rest nicht brauche, dazu müste ich einen Anfangs und eine Endwert setzen können.
Nein, Du musst mitzählen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom