Announcement

Collapse
No announcement yet.

Load local data infile

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Load local data infile

    Hallo zusammen,

    ich habe ein kleines Problem mit dem Datenimport aus einer csv in meine MySQL DB / Tabelle. Zuerst lade ich über die Importieren Funktion im Phpmyadmin eine Csv Datei in die DB. Die csv Datei enthält 6 Werte, dementsprechend sind 6 Columns dann in der DB definiert. Es wird soweit alles korrekt eingelesen --> kein Problem.

    Danach erstelle ich noch eine Spalte ID (Primary, AI) damit ich die Tabelleeinträge korrekte indexiere. Jetzt kommt in gewissen Zeitabständen mal hier und da eine neue Zeile in der csv hinzu welche per Skriptbefehl dieser jetzt bereits bestehenden Tabelle einfach hinzugefügt werden (exakt die gleiche Struktur nur neue Werte halt).

    Meine bestende Tabelle hat ja nun 7 spalten (dank ID hinzugefügt) aber die Excel csv Datei ja nur die üblichen 6 Werte. Ich will nun in dem Befehl spezifizieren, welche Spalten in der Datenbank befüllt werden sollen, und welche ausgelassen werden können.

    Besthende Table: ID | COL1 | COL2 | COL3 | COL4 | COL5 | COL6

    mein Versuch sieht so aus:
    LOAD DATA LOCAL INFILE 'testxyz.csv' INTO TABLE test1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\rn' (@dummy,@col1,@col2,@col3,@col4,@col5,@col6);

    Damit versuche ich das die erste Spalte ID ignoriert wird, aber die letzten 6 befüllt werden. Leider wird die erste Spalte nicht ignoriert, und in die anderen Spalten wird nur NULL eingetragen. Mache ich was falsch in meinem Befehl? Wie kann ich das richten? Danke sehr!

  • #2
    Hallöle,

    kann mir jmd evtl. erklären was an meinem Denkansatz hier nicht funktioniert? Habe gerade ewig gegooglet und gelesen, aber ohne Lösung ;-(

    Comment


    • #3
      Originally posted by kleinerMann View Post
      Besthende Table: ID | COL1 | COL2 | COL3 | COL4 | COL5 | COL6

      mein Versuch sieht so aus:
      LOAD DATA LOCAL INFILE 'testxyz.csv' INTO TABLE test1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\rn' (@dummy,@col1,@col2,@col3,@col4,@col5,@col6);
      Ich hab das noch nie benutzt. Die columns clause am Ende definiert offenbar die Zielfelder und die enthalten eben nicht Deine primary key Spalte.
      Die "@" gehören auch nur rein, wenn Du davon irgendwas als Variable handhaben willst. Können bzw. müssen also wohl alle raus.
      Also probier es so:
      Code:
      LOAD DATA LOCAL INFILE 'testxyz.csv' INTO TABLE test1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\rn' (col1,col2,col3,col4,col5,col6);
      P.S.: Dieses Verfahren ist eigentlich zum Masseninsert von Daten gedacht, besonders schnell.
      Vielleicht gibt es für Deine Zwecke (mal ein Datensatz hier, mal einer da) auch was anderes, praktikableres in mySQL...
      Gruß, defo

      Comment


      • #4
        Hi defo,

        besten Dank für deine Antwort. Leider verbleibt das Problem, alles beim alten....

        Das mit den @ war auch nur ein Test von mir. Es sollte doch eigentlich möglich sein, ich habe doch nichts unmögliches vor ;-(

        Wenn mir einer ein Stichwort gibt, bin ich auch gerne bereit mir eine andere Art des Einlesens anzuschauen. Es muss halt skriptgesteuert sein, da ich nicht 24/7 vorm PC hocken will, und schauen will ob mal wieder ein Ergebnis reinkommt. Danke!

        Comment


        • #5
          Ein PERL, Java o.a. Programm kann das erledigen
          Christian

          Comment


          • #6
            Hallo zusammen,

            der Tipp von defo funktioniert nun doch. Hatte mich wohl irgendwo vertippt oder so, ka...
            Jezt stört mich nur eine Sache.
            Ich habe mir die Excel Datei eingelesen, und die letzte Zeile hat die ID 2049. wenn ich dann mit dem obigen Befehl weitere Zeilen einlese, ist die nächste ID 2105 anstatt 2050. Das ist mir etwas unglogisch, kann das wer erkären? Danke

            Comment


            • #7
              Originally posted by kleinerMann View Post
              Ich habe mir die Excel Datei eingelesen, und die letzte Zeile hat die ID 2049. wenn ich dann mit dem obigen Befehl weitere Zeilen einlese, ist die nächste ID 2105 anstatt 2050. Das ist mir etwas unglogisch, kann das wer erkären? Danke
              Wie ist denn die ID angelegt? Auto Inc?
              Wie gesagt, ich hab das noch nie benutzt, daher kann ich nur vermuten:
              a) Es gibt in den Daten Fehler, die zwar einen per Insert einen Auto ID Wert ziehen, aber beim Insert wg Typverletzung, Überlänge, ..scheitern.
              Wenn das so ist, würde man entweder eine Fehlermeldung erwarten oder ein entsprechendes Log File. Dazu müsstest Du mal die mySQL Doku durchsehen.
              b) Variante von a)
              Excel enthält ja gern mal leere Zellen / Zeilen, die nicht so leer sind, wie sie aussehen. Zellen die einmal einen Wert hatten oder auch nur eine irgendwo, werden von Excel als Range Grenze ausgespuckt. Entsprechend werden dann am Ende leere Zeilen importiert usw usf., also "falsche" Bereichserkennung. In Folge tritt so was ähnliches wie a) auf.

              Propiermal beim nächsten Import die Excelsheets nach der offensichtlich letzten Daten-Zeile zu bereinigen, einfachste Möglichkeit, eine hinreichend große Menge von Zeilen(! komplett) nach den letzten Daten zu löschen (nicht leeren!). Das "Ergebnis" dieser Operation kann man durch [strn] [cursor down] oder so prüfen oder per VB Code prüfen.

              P.S: fortlaufende, lückenlose ID's werden überbewertet. Sie täuschen etwas vor, was das Verfahren nicht leistet. Das kann tückisch sein..
              l
              Gruß, defo

              Comment


              • #8
                Warnings werden hier per default nicht angezeigt, resp nur als Anzahl. Einfach nach deinem Load (innerhalb derselben Connection) "SHOW WARNINGS;" ausführen um details zu sehen.

                Das mit den springenden ID's ist eigentlich normal und keine Eigenheit von mySQL, das machen andere Datenbanksysteme auch. Jede Insert-Operation erzeugt einen neuen Schlüssel, unabhängig vom Status der Operation/Transaktion. Könnte ja sein das man mal eine DB aus den Transaktionslogs ("Binlogs") wiederherstellen muss, auf den letztmöglichsten Status. Wenn dann eine vormals fehlgeschlagene Operation (z.B. weil Disk voll) plötzlich funktioniert hätte man sonst ein wirrwarr mit den Keys - resp. eine korrupte DB.

                Die Frage ist eher, wesshalb wird in deinem Fall nur der neue Datensatz eingefügt? Denke da gibts ein Contraint auf gewissen spalten, so dass nur neue eingefügt werden?

                Sauber gelöst würde ich das ganze zuerst in eine Stageingtabelle laden, welche vor jeden load bereinigt wird und 1:1 deinem CSV entspricht. Danach das ganze auf die eigentlich Tabelle abgleichen, z.B. so. Dadurch hättest du dann auch laufende ID's wenn gewünscht.

                Comment

                Working...
                X