(Hallo|Hi(ho)|Tag|Nabend) Björn,
ich habe eine kleines Problem beim Zerlegen einer Text-datei in ein Array.
Ich habe Tabellen als txt-Datei, die im folgenden Muster vorliegen:
xxxx ##.##.## ##:##:## #:##:## 1234567890 ## _ xxxxxx xxx #### # # ## #,#### #,### ###### ##
(Leerzeichen, 4-stelliger Zahlenblock, Datum, Uhrzeit, Dauer, 2-stelliger Block, Unterstrich, Bezeichnung (mit Leerzeichen), 4-stelliger Block, Ziffer, etc etc)Leider sind die Werte (v.a. die Bezeichnung in der Mitte) teilweise mit unterschiedlichen Längen ohne erkenntliches Muster.
Warum hab ich das Gefühl dass "ohne erkenntliches Muster" und "im folgenden Muster vorliegen: ..." sich irgendwie widersprechen? ;-)
Was würdet ihr hier am Besten verwenden um die einzelnen Spalten zu zerlegen?
Du erwähntest ja schon die Möglichkeit der Anwendung Regulärer Ausdrücke. In PHP gibts dafür die Familie der Befehle mit dem Suffix preg_. Die einfachste Variante ist preg_match(). Das packst du in eine Schleife. Dann schraubst du so lange an deinem Regulären Ausdruck rum, bis er auf alle deine Textzeilen passt. Eine prinzipielle Anweisung hast du mit der Beschreibung "Leerzeichen, 4-stelliger Zahlenblock, Datum, Uhrzeit, Dauer, 2-stelliger Block, Unterstrich, Bezeichnung (mit Leerzeichen), 4-stelliger Block, Ziffer, etc etc" ja schon gegeben. Die müsstest du nur noch in einen PCRE umsetzen ...
$pcre = '/
\s+ # 1 oder mehrere Leerzeichen
([0-9]{4}) # vierstelliger Ziffernblock
\s+
([0-9]{2}.[0-9]{2}.[0-9]{4}) # Datum
\s+
([0-9]{2}:[0-9]{2}:[0-9]{2}) # Uhrzeit
\s+
... # You got the idea?
(?:\r\n|[\r\n]) # das ist der Zeilenumbruch
/x';
/*
Handelt es sich bei den Leerzeichen um echte Leerzeichen,
kannst du statt \s auch \x20 verwenden.
*/
$data = file_get_contents($datei);
for (
$pos = 0;
preg_match($pcre, $data, $hits, PREG_OFFSET_CAPTURE, $pos);
$pos = $hits[0][1] + strlen($hits[0][0]);
) {
// $hits enthält ein PHP-ARRAY mit den gefundenen Teilstücken
// (die auf die eingeklammerten Suchmuster passen)
// die kannst du dann auswerten, weiterverarbeiten, etc.
$row = array (
$hits[$klammernummer][0],
...
);
}
Im PHP-Handbuch findest du detaillierte Erläuterungen zur PCRE-Syntax und den Suchmustermodifikatioren.
Bei größeren Datenmengen ist es möglicherweise praktischer, die Daten zeilenweise einzulesen und dann jede Zeile zu zerlegen.
MffG
EisFuX