Marina G.: Import Datum aus Textdatei / Format umwandeln mySQL+PHP

Hallo liebes Forum,

ich habe eine Textdatei.
Diese Datei enthält Daten, die ich in eine mySQL DB importiere.
Mit dem Befehl:
LOAD DATA INFILE 'liste.txt' INTO TABLE jobliste FIELDS TERMINATED BY '■' LINES TERMINATED BY ' ' (spalte_datum, spalte_2, spalte)"

Das Datum in Textdatei hat das Format 13.01.05 (dd.mm.jj)
Die Spalte in der Datenbank ist VARCHAR(8)

Bis dahin funktioniert alles prima.

Leider kann ich jetzt nicht richtig nach Datum sortieren (ORDER BY)

Wie kann ich das Datum beim importieren umwandeln, damit es in
der Datenbank in das Format DATE 0000-00-00 (jjjj-mm-dd) past.

Gruß
Marina

  1. Halihallo Marina

    Das Datum in Textdatei hat das Format 13.01.05 (dd.mm.jj)
    Die Spalte in der Datenbank ist VARCHAR(8)
    Wie kann ich das Datum beim importieren umwandeln, damit es in
    der Datenbank in das Format DATE 0000-00-00 (jjjj-mm-dd) past.

    Entweder du lässt ein PHP-Script die CSV-Datei auslesen und wandelst
    die Daten-Werte über PHP in das von MySQL geforderte Format, oder
    du verwendest eine temporäre Import-Tabelle, lädst dort die CSV über
    LOAD DATA INFILE ein und überführst dann dieses Zwischenergebnis
    mittels

    REPLACE INTO real_table SELECT ... FROM temp_table

    in die "richtige", produktive Tabelle ein (indem du aber den Datums-
    Wert entsprechend in ISO-8601 bringst).

    Enpfehlen würde ich ersteres: Schreib ein Script, welches die CSV
    Zeilenweise ausliest, den Datums-Wert in das ISO-8601 Format bringt
    und die Werte über einen INSERT in die Tabelle einpflegt (bzw. eine
    neue CSV generiert, welche dann über LOAD DATA INFILE eingespiesen
    wird).

    Viele Grüsse

    Philipp

    1. Hi Philipp,

      DANKE für Deine Hilfe.

      Kannst du mir bitte Vorschlag eins etwas genauer beschreiben, wie man
      das richtig macht. Wäre für Deine Hilfe dankbar.
      (ist eine Textdatei .txt)

      Gruß
      Marina

      1. Halihallo Marina

        Kannst du mir bitte Vorschlag eins etwas genauer beschreiben, wie man
        das richtig macht. Wäre für Deine Hilfe dankbar.
        (ist eine Textdatei .txt)

        Wo hast du denn genau ein Problem? - Wo bist du dir der Umsetzung
        nicht sicher?

        Prinzipiell würde ich so vorgehen:

        Verbindung zur Datenbank öffnen
        .txt-Datei öffnen (fopen)
           jede Zeile einlesen (fgets)
              diese zeile in einzelne Werte aufsplitten (explode)
              den Wert mit dem Datum behandeln und in ISO-8601 überführen
                 (Stichwort: substring)
              INSERT INTO table (...) VALUES (...) generieren
              Query in der DB absetzen
        .txt-Datei schliessen (fclose)
        Verbindung zur Datenbank schliessen

        Fehlerbehandlungsroutine schreiben um Fehler zu sehen und abzufangen

        ... und das jetzt in PHP umsetzen.

        Viele Grüsse

        Philipp

        1. Hallo Phillipo,

          wie macht man folgendes in PHP:

          .txt-Datei öffnen (fopen)
          jede Zeile einlesen (fgets)
          diese zeile in einzelne Werte aufsplitten (explode)
          den Wert mit dem Datum behandeln und in ISO-8601 überführen

          Wie ändere ich das Datum in der Textdatei.
          So sehen die Zeilen in der Textdatei aus.

          Wert1aþWert2aþ13.01.05ÿ
          Wert1bþWert2bþ03.01.05ÿ
          usw...

          Das danach die Zeilen so aussehen

          Wert1aþWert2aþ20050113ÿ
          Wert1bþWert2bþ20050103ÿ
          usw...

          DANKE

          Grüß
          Fragetante

          1. Hallo Philipp,

            jede Zeile einlesen (fgets)

            Ich habe in der Textdatei nachgeschaut. Die Daten haben keinen Zeilenumbruch. SORRY

            So sieht es aus:

            Wert1aþWert2aþ13.01.05ÿWert1bþWert2bþ03.01.05ÿ
            usw...

            Das danach die Zeilen so aussehen
            Wert1aþWert2aþ20050113ÿWert1bþWert2bþ20050103ÿ
            usw...

            DANKE

            Grüß
            Marina

            1. Halihallo Marina

              jede Zeile einlesen (fgets)
              Ich habe in der Textdatei nachgeschaut. Die Daten haben keinen Zeilenumbruch. SORRY

              ich glaube schon, aber du verwendest in deinem Editor einen anderen
              Zeichensatz, als der mit dem die CSV-Datei erstellt wurde.

              Wert1aþWert2aþ13.01.05ÿWert1bþWert2bþ03.01.05ÿ
              Das danach die Zeilen so aussehen
              Wert1aþWert2aþ20050113ÿWert1bþWert2bþ20050103ÿ

              http://www.php.net/substr lesen!
              http://ch2.php.net/manual/de/language.operators.string.php
                lesen um die Teilstrings von substr wieder zusammenzuhängen.

              Damit lässt sich folgendes machen:

              Jahr von Eingabe auslesen => $jahr
              Monat von Eingabe auslesen=> $monat
              Tag    "    "       "     => $tag

              $ausgabe_datum = "20$jahr$monat$tag";

              Ein Tipp: Versuche erstmal die einzelnen Werte und Datensätze auszu-
              lesen. Die Datums-Transformation ist erst dein sekundäres Problem...

              Viele Grüsse

              Philipp

              1. Hallo Philipp,

                Kann das sein, das substr hier nicht funktioniert?
                Da Wert1 & Wert2 keine feste Zeichenlänge haben.
                Wert1aþWert2aþ13.01.05ÿ

                Das Problem für mich ist. Tag, Monat & Jahr an der Position
                (zwischen þ ÿ) herauszuholen.
                Richtig ordnen kann ich.
                Und das neue Format an der richtigen Stelle reinschreiben, kann ich leider auch nicht.

                Den Rest bekomme ich sicherlich hin.

                Vielleicht kannst du mir ja etwas PHP-Code zeigen.
                DANKE

                Gruß
                Marina

                1. Halihallo Marina

                  Kann das sein, das substr hier nicht funktioniert?
                  Da Wert1 & Wert2 keine feste Zeichenlänge haben.
                  Wert1aþWert2aþ13.01.05ÿ

                  Richtig. Deswegen habe ich auch schon gesagt, dass das extrahieren
                  bzw. umwandeln der Daten auch nicht dein primäres, sondern sekundäres
                  Problem ist. Ich sagte schon: befasse dich zuerst damit, die
                  einzelnen Felder und Datensätze auseinanderzubrechen (nochmals:
                  Strichwort explode). Dann hast du das Feld Datum in einem String und
                  und dieser folgt einem genauen Muster (hoffentlich...).

                  Das Problem für mich ist. Tag, Monat & Jahr an der Position
                  (zwischen þ ÿ) herauszuholen.
                  Richtig ordnen kann ich.
                  Und das neue Format an der richtigen Stelle reinschreiben, kann ich leider auch nicht.

                  Du denkst zu straight. Musst ja nicht grad von 0 auf 100 in einer
                  Sekunde beschleunigen wollen...

                  Also nochmals, ich muss ja ebenfalls nicht gleich mit der Türe ins
                  Haus fallen...:

                  zuerst musst du mal die einzelnen Datensätze trennen:
                  Dieses 'ÿ'-Zeichen scheint hier der Delimiter zu sein. Also, mach
                  das mal, trenn den String mal an diesen Zeichen. Dann hast du über
                  explode schonmal ein Array aus Datensätzen (in CSV sind die
                  Datensätze die Zeilen).
                  So, und nun interessieren dich natürlich die Daten (jetzt mal nicht
                  als plural von Datum zu verstehen), hier scheint 'þ' dein Delimiter
                  zu sein. Nun OK, iteriere über dein vorher generiertes Array von
                  Datensätzen (also mach folgendes für jeden Eintrag im Array) und
                  splitte diese Strings erneut über explode bei 'þ' auf. So hast du
                  nun erneut ein Array aus Feldern deines aktuell verarbeiteten
                  Datensatzes.
                  in $felder[0] steht dann 'Wert1a', $felder[1] steht 'Wert1b' und
                  in $felder[2] steht dein '03.01.05' und jetzt kannst du mittels
                  substr das Datum in $felder[2] in ISO-8601 überführen.
                  Dann bildest du einen SQL-Query mit den Daten aus dem Array $felder.

                  Vielleicht kannst du mir ja etwas PHP-Code zeigen.

                  Nö, den Spass will ich dir nicht nehmen, sonst hast du ja gar nichts
                  von diesem Forum.

                  Viele Grüsse

                  Philipp

    2. Hallo Philipp!

      Das hat jetzt zwar so überhaupt nichts mit dem aktuellen Thread zu tun, aber ich habe gerade eine Diskussion zum Thema "möchtegern-Hochverfügbarkeit" gelesen, die Dich vielleicht interessiert: http://www.rootforum.de/forum/viewtopic.php?t=33553

      Grüße
      Andreas

      1. Halihallo Andreas

        Das hat jetzt zwar so überhaupt nichts mit dem aktuellen Thread zu tun, aber ich habe gerade eine Diskussion zum Thema "möchtegern-Hochverfügbarkeit" gelesen, die Dich vielleicht interessiert: http://www.rootforum.de/forum/viewtopic.php?t=33553

        Oh, vielen Dank für deine Aufmerksamkeit!

        Da habe ich einiges gelernt, als ich mich notgedrungen noch etwas
        in DRBD, UML (User Mode Linux), HA und HP einlesen musste, um den
        Beitrag oder besser die enthaltenen Wörter zu verstehen :-)

        Danke für den Link. Bin dadurch auch auf
        http://www.lcic.org/ (Linux Clustering Information Center)
        http://www.lcic.org/ (Linux High Availability)
        gestossen. Finde ich auch informativ.

        Viele Grüsse und Danke

        Philipp