Björn: regex, eplode oder x?

Hallo liebe Community! :)

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.

Was würdet ihr hier am Besten verwenden um die einzelnen Spalten zu zerlegen?

Bin über jede Hilfe dankbar :)
Liebe Grüße
Björn

  1. 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.

    Was würdet ihr hier am Besten verwenden um die einzelnen Spalten zu zerlegen?

    wenn es keni erkennbares muster gibt, hast du mit regulären ausdrücken keine chance - die basieren darauf, dass man erkennbare muster eben in einen ausdruck umformt ;)

    explode hilft dir auch nicht weiter, du ja nicht weißt, welches leerzeichen was trennt

    gibts die tabelle ggf. in einer anderen form - zb tabulator-separiert oder komma-separiert?

    im übrigen wäre es interessant die echten daten oder zumindest einen auszug daraus (meinetwegen auch verschleiert) zu sehen, ein passender regulärer ausdruck lässt sich wahrscheinlich finden, da du ja immerhin als mensch auch ein muster beim lesen erkennst ;)

    1. Die Daten sehen wie folgt aus:

      0033 01.07.08 04:57:16   0:00:49 ##########      01 _   Weinheim Bergstr     R002 A  ##### T      1   #,####     #,#### ###### 50

      Die Tabelle beinhaltet Telefonverbindungen mit Rufnummer und Verbindungseinheiten etc.

      Wäre ein Tabulator das Trennzeichen wäre die Sache schon viel schöner. Das ist leider jedoch nicht der Fall :(

      Das Thema "Streams" ist vielleicht nicht uninteressant. Leider gibt es dort nur wenig Dokumentation und die Beispiele helfen mir auch nicht wirklich weiter...

      Aber schon mal vielen Dank euch beiden! :)

      1. Hello,

        Das Thema "Streams" ist vielleicht nicht uninteressant. Leider gibt es dort nur wenig Dokumentation und die Beispiele helfen mir auch nicht wirklich weiter...

        So einen simplen kannst Du Dir doch auch selber schreiben,
        Wesentlich ist daoch dabei nur die Synchronisation. Wenn mal ein feld fehlen sollte, muss spätestens mit dem nächsten Zeilenwechsel (wenn der denn vorhanden ist) wieder synchrinisiert wreden, besser beim Formatwechsel. Da helfen dann eben nur RegExps, die nacheinander abgearbeitet werden.

        Soweit ich das aber sehen konnte, werden Leerfelder durch '-' gekennzeichnet.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. hmmm, also ich hab mir mal diese Klasse kopiert und wollte damit was anzeigen.
          Aber so wirklich weitergekommen bin ich auch nicht :-/
          Bin jetzt noch nicht so der PHP-Profi ^^

            
              include('inc/eac_streams.class.php');  
              $http = new stream();  
              $result = $http->get('tmp/daten.txt');  
          
          
  2. Hello,

    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)

    Da hilft fgetcsv(), eventuell noch mit nachträglichem trim() auf die Elemente.

    http://www.php.net/fgetcsv

    Mit etwas mehr Background könntest Du auch mit den Stream-Funktionen zum Erfolg kommen:
    http://www.php.net/manual/de/book.stream.php

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. (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

    1. mit dem Suffix preg_

      präfix (von lateinisch "prä" für "vor" und "fix" für "fest")
      suffix ist (von lateinisch "suffigo" oder "suffigere" - etwa "daran befestigen" oder "anhängen")

      1. (Hallo|Hi(ho)|Nabend) suit,

        mit dem Suffix preg_
        präfix (von lateinisch "prä" für "vor" und "fix" für "fest")
        suffix ist (von lateinisch "suffigo" oder "suffigere" - etwa "daran befestigen" oder "anhängen")

        Richtig, Herr Lehrer! ;-)
        Dies ist mir durchaus bekannt, aber aus irgendeinem Grund arbeitete beim Tippen des Textes mein Verstand wohl nicht mit ausreichender Suffizienz ...

        MffG
        EisuffFiX

      2. @@suit:

        präfix (von lateinisch "prä" für "vor" und "fix" für "fest")

        s.a. http://forum.de.selfhtml.org/archiv/2005/4/t104964/#m648380 ;-)

        Live long and prosper,
        Gunnar

        --
        Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.