Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit " und LOAD DATA INFILE

Einklappen

Neue Werbung 2019

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

  • Probleme mit " und LOAD DATA INFILE

    Hallo,

    Ich verwende

    Code:
    load data infile '/etc/ARTH1AWYC.csv' into table alpha_artdaten fields terminated by ';' enclosed by '"' lines terminated by '\r\n' (ARTNR, AARTNR, ISBN, BESTNR, AUTOR, TITEL, UTITEL, VERLAG, @BETRAG, WAEHR, @MWST, @ALTEP, ERDAT, DTBEZ, EINBND, ARTLKZ, SEITZL, SGBEZ, SG, AKTDAT, VNR, FORMAT, GEWT) SET BETRAG = replace(@BETRAG, ',', '.'), MWST = replace(@MWST, ',', '.'), ALTEP = replace(@ALTEP, ',', '.');
    um Daten aus einer CSV Datei in die Datenbank zu laden. Probleme habe ich aber wenn ein Feld zwei " enthält wie z.B.:

    "154954";"";"9783761549544";"154954000";"Lisa Fuchs";"Schlaumeier - der kleine Fuchs";""Kleine und grosse Überaschungen im Königswald"";"Aussaat Verlag";"7,57";"EUR";"7,50";"0,00";"03/1997";"Buch";"geh.";"31";"30";"Kinderbücher ab 4";"72";"20100831163001";"AV";"16,7 x 24,4 cm";"124.00"

    Offensichtlich glaubt MySQL das mit dem 2. " das Feld zu Ende ist und beginnt dann ein neues Feld was natürlich die Zahl der Felder durcheinander bringt und damit den Import dieser Zeile nicht möglich macht.

    Warum teilt es die Felder nicht nach ; auf wie angegeben und wie kann ich die Daten korrekt importieren?

    Vielen Dank

    Martin


  • #2
    wenn es mysql nicht selbst schafft, nimm php , fgetcsv wäre dann dein Suchstichwort

    wenn das immer noch nicht klappt, arbeite mit

    PHP-Code:
    $lines=file(Dateiname); // hier richtigen Dateinamen mit Pfad eintragen
    foreach ($lines as $number => $line) {
       
    $werte=explode(";",$line);
       
    // jetzt kannst du dich um die Erkennung doppelter Double-Quotes kümmmern
       
    for ($i=0;$i<count($werte);$i++) {
          if (
    strlen($werte[$i])>AND substr($werte[$i],0,2)=='""'// 
             
    $werte[$i]=substr($werte[$i],2,-4);
          ...
    // Werte in db schreiben 
    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

    Kommentar


    • #3
      Ich würde lieber mal darüber nachdenken, warum die CSV-Datei kaputt ist.

      Kommentar


      • #4
        hm kaputt würd ich das nicht nennen, so sehn die bei mir auch aus, wenn Excel die ausspuckt - besonders wenn im Datenfeld sowieso Anführungszeichen vorkamen, wie bei Eigennamen . ich hab sogar schon Kombinationen aus 3 , 6 und mehr Double-Quotes gesehen

        wenn ich mir den Datensatz da oben recht ansehe, scheint es sich beim Monierten Datenfeld um einen Eigennamen / Buchtitel oder ähnliches zu handeln, die schon mal in Anführungszeichen stehen ...
        "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

        Kommentar


        • #5
          Zitat von mvoelkening Beitrag anzeigen
          Offensichtlich glaubt MySQL das mit dem 2. " das Feld zu Ende ist und beginnt dann ein neues Feld was natürlich die Zahl der Felder durcheinander bringt und damit den Import dieser Zeile nicht möglich macht.
          Das sollte laut Doku nicht passieren.

          http://dev.mysql.com/doc/refman/5.1/en/load-data.html:
          To avoid ambiguity, occurrences of the ENCLOSED BY character within a field value can be doubled and are interpreted as a single instance of the character. For example, if ENCLOSED BY '"' is specified, quotation marks are handled as shown here:
          Code:
          "The ""BIG"" boss"  -> The "BIG" boss
          The "BIG" boss      -> The "BIG" boss
          The ""BIG"" boss    -> The ""BIG"" boss
          "154954";"";"9783761549544";"154954000";"Lisa Fuchs";"Schlaumeier - der kleine Fuchs";""Kleine und grosse Überaschungen im Königswald"";...
          Vielleicht verwirrt dieses leere zweite Feld den Parser?

          Kommentar


          • #6
            möglicherweise hilft dir das

            If FIELDS ESCAPED BY is empty, a field value that contains an occurrence of FIELDS ENCLOSED BY or LINES TERMINATED BY followed by the FIELDS TERMINATED BY value causes LOAD DATA INFILE to stop reading a field or line too early. This happens because LOAD DATA INFILE cannot properly determine where the field or line value ends.

            also gib einfach ein ESCAPED BY '\' an auch wenn du gar nicht das in den Daten gar nicht der Fall ist
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

            Kommentar

            Lädt...
            X