Ankündigung

Einklappen
Keine Ankündigung bisher.

LOAD DATA INFILE und Daten beim Einfügen ändern?

Einklappen

Neue Werbung 2019

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

  • LOAD DATA INFILE und Daten beim Einfügen ändern?

    Servus !

    Ich habe von unserem Großhändler eine CSV die bei denen auf dem FTP Account liegt. Diese beinhaltet alle Relevanten Daten zu den Artikeln, die diese anbieten. Darunter natürlich auch den Preis. Warum auch immer, ist dieser mit einem Komma getrennt und schlimmer noch, die Tausender Bereiche mit einem Punkt.

    z.b. 2.130,99

    Um damit aber anständig arbeiten zu können, wäre es Hilfreich, diese Zahl schon beim Einlesen in die Datenbank zu ändern. Im Moment ist mein Preisfeld ein String. Zum rechnen total umständlich.

    Ich nehme einfach mal ein Beispiel aus meiner Cronjob Datei, die schon vorhandene Preisliste aktualisiert, wo aber das selbe Problem gegeben ist. (hek = Preis)

    PHP-Code:
    $source='ftp://...........liste.csv';
    $uploadfile=$_SERVER['DOCUMENT_ROOT'].'/tmp/'.basename($source);
    file_put_contents($uploadfile,file_get_contents($source)); //läd Datei auf den Server

    $query_one =  $DB->query("
              TRUNCATE TABLE kc_shop_artikel_tmp
    "
    ); //leert Tabelle

    $query_two =  $DB->query("
              LOAD DATA LOCAL INFILE '
    $uploadfile
              REPLACE INTO TABLE kc_shop_artikel_tmp 
              FIELDS TERMINATED BY '\t' IGNORE 1 
              LINES (artnr, hersteller_nr, bestand, hek)
    "
    ); //läd Datei in Datenbank

    $query_three =  $DB->query("
              UPDATE 
    $TABLE_ARTIKEL s LEFT JOIN kc_shop_artikel_tmp c 
              USING(artnr) SET s.bestand=c.bestand, s.hek=c.hek
    "
    ); //Updatet alle Änderrungen in Artikel-DB

    unlink ($uploadfile); //löscht Temp-Datei 
    Wie kann ich es schon beim eintragen in die Datenbank erreichen, das meine Zahlen richtig formatiert werden. Wenn ich in der Datenbank bereits das Feld als DOUBLE eingerichtet habe, muss die Änderrung zwangsläufig schon vorher passieren. Die über 10 MB große CSV Datei aber zu ändern kommt nicht in Frage. (Habe nur 30 Sek. Zeit für mein Cronjob)

    LG Terra

  • #2
    Ich bin jetzt nicht der große MySQL-Spezialist, aber hast Du Dir REPLACE() mal angeschaut?

    Kommentar


    • #3
      Habe ich. Da gibt es allerdings 2 Varianten.

      Einmal die normale ("REPLACE INTO Anweisung, was ich eher nicht gebrauchen kann und dann die Spaltenorientierte Lösung:

      SET spalte = REPLACE(spalte, 'suche_string','ersetze_string');

      Bei der 2. Variante habe ich aber ein Problem. Ich kann nur eine Änderrung auf einmal vornehmen. Entweder lösche ich den Punkt oder ich ersetze das Komma durch einen Punkt. Beides zusammen wäre mir jetzt zu hoch.

      Muss es irgendwie hinbekommen das aus 2.345,67 => 2345.67 wird.

      LG Terra

      Kommentar


      • #4
        SET spalte = REPLACE(REPLACE(spalte, '.',''), ',','.')
        Also so würd ichs jetzt in php mittel str_replace lösen, weis nur halt nicht obs bei MySQL auch so funktioniert, aber halt mal so als input von meiner Seite ^^

        Kommentar


        • #5
          Zitat von terra75 Beitrag anzeigen
          Bei der 2. Variante habe ich aber ein Problem. Ich kann nur eine Änderrung auf einmal vornehmen. Entweder lösche ich den Punkt oder ich ersetze das Komma durch einen Punkt.
          Oder du entfernst erst den Punkt, und im Ergebnis dieser Operation ersetzt du dann das Komma durch einen Punkt ...

          Sprich, zwei REPLACE-Anweisungen ineinander verschachteln.

          Kommentar


          • #6
            Die Idee ist interessant und schon fast so nahliegend, das ich selber drauf kommen müsste. Mache es ja z.Z. nicht anders in PHP.

            PHP-Code:
            function _editprice($preis){
                
            $schritt1 =    str_replace('.''',$preis);
                
            $schritt2 =    str_replace(',''.',$schritt1);
                return 
            $schritt2;

            Jetzt kommt die große Frage: Geht das auch direkt in MySQL?
            Also mit: SET spalte = REPLACE(REPLACE(spalte, '.',''), ',','.')

            Ich werde es Probieren und berichten !

            LG Terra

            Kommentar


            • #7
              Warum auch immer
              Ist ein normales deutsches Zahlenformat.

              Benutzt DU ohnehin PHP? Dann mach das doch lieber dort. Dann kannst Du nämlich DB-seitig echte FLOAT-Typen verwenden.

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Benutzt DU ohnehin PHP? Dann mach das doch lieber dort. Dann kannst Du nämlich DB-seitig echte FLOAT-Typen verwenden.
                Habe im Moment aber ein ziemliches KuddelMuddel bei mir im Script. Arbeite von Anfang an mit normalen verwertbaren Zahlenformaten, die in PHP gegeben sind. Also 10.99 oder 12345.99 u.s.w.

                Will jetzt von meiner Norm nicht abweichen, was aber mit der CSV Liste geschehen ist und ich jetzt aber ändern möchte.

                Achso, habe es wie oben ausprobiert. Geht leider nicht. Ich bekomme keine Fehlermeldung aber sehr seltsame Zahlen. Aus 47,42 wird auf einmal 500.00

                PHP-Code:
                $query1 =  $DB->query("
                     LOAD DATA LOCAL INFILE '
                $uploadfile
                     INTO TABLE 
                $TABLE_ARTIKEL FIELDS 
                     TERMINATED BY '\t' IGNORE 1 LINES 
                     SET hek = (REPLACE(REPLACE(hek, '.',''), ',','.'))
                "
                ); 
                LG Terra

                Kommentar

                Lädt...
                X