Ankündigung

Einklappen
Keine Ankündigung bisher.

LOAD DATA INFILE -> Anfängerproblem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • LOAD DATA INFILE -> Anfängerproblem

    Hallo liebe Forenmitglieder

    Ich habe von meinem Chef eine Aufgabe bekommen die ich einfach nicht lösen kann -> meine Kenntnisse reichen einfach nicht.

    Ich hoffe jemand von euch kann mir dabei behilflich sein

    Ausgangslage: Unser Zeiterfassungssystem generiert ein File das so aussieht:

    Code:
    Name Vorname 80%, D < 11:52                    ;0167;5;        :-
    Name1 Vorname1         07:20                     ;0043;2;        :-
    Name2 Vorname2                                      ;0064;5;        :-
    Name3 Vorname3            < 11:00                    ;0066;5;        :-
    Das ganze muss ich nun in eine Datenbank übertragen.

    Die Datenbank sollte in etwa so aussehen:
    Name Anwesend
    Name Vorname 1
    Name1 Vorname1 1
    Name2 Vorname2 0

    Für die erste Spalte könnte man einfach eine Abfrage machen bis zum ersten doppel-Leerzeichen nach dem Namen.
    Für die zweite Spalte reicht mir dann ein 1 oder 0 (1 Anwesend / 0 Abwesend). Anwesend wenn: 1. Zeichen nach Name '<' oder 'Zahl' ; Abwesend wenn 1. Zeichen nach Name ';' oder 'Buchstabe'

    Wenn ich das einmal geschafft habe muss ich dass dann irgenwie einstellen, dass es die Abfrage alle paar Minuten macht.

    Folgendes habe ich bereits geschafft:
    PHP-Code:
    LOAD DATA LOCAL INFILE 'C:/Intranet/htdocs/Pip-TXT.TXT' INTO TABLE mobatime 
    LINES TERMINATED BY 
    ';' 
    Dann importiert er mir aber alles in die Spalte 'Name'. Und ich möchte das nach LINES TERMINATED BY ';' der Rest der Zeile ignoriert wird. Jetzt macht er mir immer nach einem ; eine neue Zeile.

    Weiter habe ich gefunden:
    PHP-Code:
    LOAD DATA LOCAL INFILE 'C:/Intranet/htdocs/Pip-TXT.TXT' INTO TABLE mobatime 
    FIELD 1    TERMINATED BY 
    '<'
    FIELD 2    TERMINATED BY ';'
    LINES TERMINATED BY ';' 
    Aber irgenwie geht das garnicht und ich komme einfach nicht weiter. Meine Grundkenntnisse reichen einfach nicht aus dafür.

    Es wäre wirklich super wenn mir jemand weiterhelfen könnte.

    Herzlichen Dank

    Lukas

  • #2
    Dann importiert er mir aber alles in die Spalte 'Name'.
    Du sagst ja auch nicht, in welche Spalten was gehen soll. sh. https://dev.mysql.com/doc/refman/5.7/en/load-data.html, da steht auch, wie Daten nachbearbeitet werden.

    Kommentar


    • #3
      LOAD DATA INFILE sollte eine Datei mit einer fixen Struktur für jede Zeile vorfinden, alles andere mündet in einer endlosen Fummelei wenn es überhaupt funktioniert.
      Im oben gezeigten Ausschnitt der Datei kann ich eine solche Struktur nicht erkennen und würde daher rangehen, die Datei per PHP zeilenweise einzulesen und zu parsen.
      Je nach Umfang der Datei dann die Informationen per INSERT zeilenweise einfügen oder eine temporäre Datei (*.csv?) erzeugen, welche dann per LOAD DATA INFILE in die Datenbank geladen wird.

      Kommentar


      • #4
        danke erstmal für eure antworten. Leider kann ich das Format der Datei nicht verändern - das ist einfach der Output aus dem System das wir haben.

        Zeilenweise finde ich jetzt auch nicht ganz optimal, dann muss ich jedesmal wenn ein neuer Mitarbeiter anfängt oder uns verlässt den Code anpassen... oder verstehe ich das falsch?

        Gibt es sonst eine Lösung das ganze optimal in eine Datenbank zu lesen? Eigentlich sollte es ja nicht so kompliziert sein (denkt der laie ). Der Code muss einfach die ersten beiden Wörter als Name importieren und dann das erste Zeichen danach als 1/0 interpretieren. Dabei muss der Code einfach alles was sonst noch in der Datei steht ignorieren (inkl. die Leerzeichen).

        Gruss

        Lukas

        Kommentar


        • #5
          Der Code muss einfach die ersten beiden Wörter als Name importieren
          "Hans Georg Müller" ...

          Kommentar


          • #6
            Sag deinem Chef das der Output von dem Zeiterfassungssystem nicht maschinenlesbar ausgeworfen wird.
            Kannst uns ja mitteilen was er dazu gesagt, hat. Vielleicht ist das auch nur ein Test und eine eigentlich unlösbare Aufgabe.
            Das Beispiel von Dormilch zeigt ja schon auf welche Schrwierigkeiten man so stösst.

            Kommentar


            • #7
              leider nein, das ist kein test... wir brauchen das.

              aber ok. dann muss ich wohl noch eine andere lösung finden...

              danke für eure hilfe - und wenn jemand eine idee hat, nur her damit

              Kommentar


              • #8
                Der Anwesend-Status geht ja noch (Uhrzeit suchen), aber wie man an der ersten Zeile sieht, ist das Herausfinden von Namen schwierig (es gibt ja nicht nur A-Z, sondern auch Ziffern, Interpunktionen, ü, ß, ç, ø, etc. (asiatische Namen noch gar nicht mit einbezogen)).

                Kommentar


                • #9
                  naja. da könnte ich wohl mit kompromissen leben. Die meisten MA haben nur 2 namen. Im Format Nachname Vorname 1, Vorname 2 - wenn da der 2te vorname fehlt ist das wohl egal.

                  Kommentar


                  • #10
                    oder theoretisch könnte ich die mitarbeiter auch manuell erfassen und dann einfach im txt abfragen. so a la: suche namen, auf dieser zeile zeit auslesen... ginge das?

                    Kommentar


                    • #11
                      Was machst du bei zwei Nachnamen?

                      edit: warum soll das nicht gehen? mußt halt nur auf die Zeichensätze und eventuelle Transkriptionen achten.

                      Kommentar


                      • #12
                        Code:
                        Name Vorname 80%, D < 11:52                    ;0167;5;        :-
                        Was ist die Zahl? Beschäftigungsausmaß? Bis dahin könnte man ja lesen. Und das ist dann halt der Name.

                        Du kommst wohl nicht rum, dir da einen eigenen Parser mit (z.B.) PHP zu schreiben.
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          ja die zahl ist beschäftigungsgrad. Die datei sieht dann so aus:
                          edit: bild entfernt

                          Kommentar


                          • #14
                            Das ist ein fixed length Format. Das lässt sich einfacher verarbieten...

                            Code:
                            LOAD DATA LOCAL INFILE 'C:/Intranet/htdocs/Pip-TXT.TXT' INTO TABLE mobatime
                            (@raw)
                            SET
                            benutzer=TRIM(SUBSTR(@raw,0,24)),
                            anwesend=IF(TRIM(SUBSTR(@raw,24,5) != "", 1, 0)
                            Die ersten 24 Zeichen sind der Name (musste nochmal selbst prüfen) und wenn in den nächsten 5 Zeichen irgendwas steht, ist er anwesend ansonsten nicht.

                            Kommentar


                            • #15
                              Das ist doch jetzt nicht schwer. Wenn ich richtig gezählt habe stehen die Zeiten immer ab Pos.23. da musst du ja dann nur schauen ob da ein "<" oder eine Ziffer steht, dann wäre er anwesend.

                              Edit: öhm, zu spät


                              Kommentar

                              Lädt...
                              X