Andreas Korthaus: /PERL Performance-Frage - Parsen

Beitrag lesen

Hallo!

Ich habe kürzlich eine ausführliche Diskussion von wegen Synchronisation und Datenübertragung mit Klaus Mock geführt(</archiv/2002/9/24654>). Dabei ging es um das folgende Datenformat, welches per HTTP von einem zum anderen Server geschickt wird:

[TABELLENNAME]
ID:4711
HERKUNFT:123
NAME:ABCDEF
WERT:1234
MEMO:xyzdsdskdkjdsk
MODFLAG:1
[EOR]
ID:4712
HERKUNFT:123
NAME:ABCDEF
WERT:1234
MEMO:xyzdsdskdkjdsk
MODFLAG:1
[EOR]
...
[ANDERE_TABELLE]
ID:815
HERKUNFT:123
...

Die Frage ist jetzt, wie man diese Daten am performantesten mit PHP parsen kann, da es sich durchaus um einige 1000 Datensätze handeln kann.
Klaus hatte für PERL folgendes vorgeschlagen:

my($tabelle,%daten);
foreach(@inputlines) {
 chomp;
 if(/^[EOR]$/) {
    run_import_record($tabelle,%daten) if $tabelle;
  %daten = ();
  }
 elsif(/^[(.+)]$/) {
  $tabelle = $1;
  }
 else {
  my($name,$wert) = split('\s*:\s*',$_,2);
  $daten{$name}=$wert;
  }
 }

In PHP könnte das dann so aussehen:

foreach($inputlines as $line) {
    if (preg_match("/^[EOR]$/", $line)) {
        run_import_record($tabelle,$daten);
        unset($daten);
    }
    else if(preg_match("/^[(.+)]$/", $line, $matches)) {
        $tabelle = $matches[1];
    }
    else {
        list($name, $wert) = preg_split("/:/", $line, 2);
        $daten[$name]=$wert;
    }
}

Das ganze soll in PHP laufen(oder würde PERL einen erheblichen Performance-Vorteil bedeuten?).

Es gibt 2 mögliche Varianten:
1. Übertragung direkt als String in einer POST-Variable
2. Übertragung als multipart/form-data, also als "Datei-Upload".

Beim 2. Ansatz könnte ich in PHP die temporäre Datei direkt mit file() öffnen und hätte einen Array mit Zeilen, den ich wie oben abarbeiten könnte.

Beim ersten Ansatz müßte ich erst bei \n splitten, was nicht unbedingt optimal sein sollte, aber ich weiß keine besser Möglichkeit diesen String zu parsen. Hat vielleicht jemand ne Idee wie man die Performance des Parsens noch verbessern könnte?

Viele Grüße
Andreas