Text-file ab bestimmtem substring lesen

Hallo allerseits,

ich habe einige große Text-files (>50MB), die ich verarbeiten und teilweise in verschiedene Datenbank-Tabellen übertragen muss. Das ganze wird eine Routine, die sich mehrmals wöchentlich wiederholt. Dabei muss ich jetzt immer die ganze Datei von oben bis unten durchgehen, nach einem substring suchen, diesen verarbeiten (in der DB einsortieren) und den folgenden substring suchen. Das ganze ist sehr zeitaufwendig. Für 25.000 „substrings“ benötigt das Skript 45 Minuten. Und dann habe ich erst eine von 40 Dateien bearbeitet. => Alle Dateien auf diese Weise zu bearbeiten dauert fast eineinhalb Tage und frisst alle verfügbaren Ressourcen auf.

Zurzeit gehe ich rekursiv so vor:

  1. Datei komplett laden
  2. substring auslesen von Endposition des vorherigen Durchlaufs [substr($datei, $endposition_letzter_durchlauf, 50000);] (um den string auf eine verarbeitbare Größe zu reduzieren)
  3. $end-tag suchen
  4. $endposition_letzter_durchlauf bis $end-tag verarbeiten und in DB übertragen
  5. $länge_des_verarbeiteten_strings ermitteln
  6. $endposition_letzter_durchlauf + $länge_des_verarbeiteten_strings = $endposition_letzter_durchlauf

Da ich meine website bei einem Drittanbieter gehostet habe, kann die Skriptlaufzeit maximal 30sec. betragen. Ich muss deshalb scheibchenweise meine Datei verarbeiten und das Script dann an der neuen Startposition ($endposition_letzter_durchlauf) neu starten.

Nun meine Frage:
Gibt es eine Möglichkeit, schon beim Laden der Datei einen substring zu suchen und nur diesen Teil in eine Variable zu überführen?
Das würde einiges an Ressourcen und Zeit sparen. Dann könnte ich beim Aufruf einer Seite prüfen, ob der aus meinem text-file relevante Inhalt vor mehr als sieben tagen zuletzt aktualisiert wurde und bei Bedarf gezielt den relevanten Teil auslesen und aktualisieren, statt wöchentlich alle Inhalte mit der genannten Methode zu aktualisieren.

Viele Grüße,
David

Hi David,

kannst du mir mal eine Textdatei mit Beispielinhalt liefern und erläutern, welche Stellen du wie brauchst?

Dann tüftel ich mal. Kannst mir auch schreiben an thomas at theel punkt de

Nun meine Frage:
Gibt es eine Möglichkeit, schon beim Laden der Datei einen
substring zu suchen und nur diesen Teil in eine Variable zu
überführen?
Das würde einiges an Ressourcen und Zeit sparen. Dann könnte
ich beim Aufruf einer Seite prüfen, ob der aus meinem
text-file relevante Inhalt vor mehr als sieben tagen zuletzt
aktualisiert wurde und bei Bedarf gezielt den relevanten Teil
auslesen und aktualisieren, statt wöchentlich alle Inhalte mit
der genannten Methode zu aktualisieren.

Viele Grüße,
David

Hallo!

Spontan würde mir die strpos()-Funktion einfallen.

Übergib ihr den Inhalt der Datei und gib einen String an, nachdem gesucht werden soll. Als Rückgabewert erhältst du die Position des Strings als INT.

PHP: strpos - Manual

Hi Creeping,

genau das mache ich ja auch. Ich möchte aber gar nicht erst den ganze Inhalt der Datei in den Zwischenspeicher laden müssen.
Verstehst du, was ich meine?

Wenn ich sage: strpos(fopen($datei, ‚r‘), $substring), dann wird doch zunächst mal der gesamte Inhalt meiner Textdatei geladen, oder nicht?

mfg,
David