CSV Import in MySQL DB / Umlaute / doppelter Eintrag

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

  • CSV Import in MySQL DB / Umlaute / doppelter Eintrag

    Hallo zusammen,

    mit folgendem Script importiere ich Daten aus einer CSV-Datei in eine MySQL-Datenbank:
    PHP-Code:
    $pfadCSV 'csv-daten/Funding-Original.csv';
        
        
    $row 1;
        
    $handle fopen($pfadCSV,'r');
        
        while((
    $daten fgetcsv($handle,1000,';')) !== FALSE){
        
            
    print_r($daten);
            
    $num count($daten);
            echo 
    $num." Felder in Zeile ".$row.":<br />\n";
            echo 
    $row."<br />";
            
            
            
    $query  "INSERT INTO tabelle (emittent,allgemein,...)";
            
    $query .= "VALUES (";
            for (
    $c=0$c $num$c++) {
                echo 
    $daten[$c] . "<br />\n";
                
                if(
    $c 0){$query .= ",";}
                
    $query .= "'".$daten[$c];
                
    $query .= "'";
                
            }
            
    $query .= ")";
            echo 
    $query."<br />";
            
            
    mysql_query($query);
            
    $row++;

        } 
        
        
    fclose($handle); 
    Das klappt eigentlich recht gut. Nur in dem Fall, das einer der Werte einen Umlaut enthält (äöü), werden alle Daten doppelt eingetragen. Kollation der DB ist UTF8. Die Datei hab ich auch in UTF8 gespeichert. Es sieht fast so aus, als ob dann das 'mysql_query' zweimal ausgeführt würde?!? Wer hat einen Rat?

  • #2
    Wenn ich vor das while ein TRUNCATE setze, werden die Daten nicht mehr doppelt eingetragen. Das löst zwar aktuell das Problem, erklärt aber nicht die Ursache. mmmh....

    Kommentar


    • #3
      Du importierst alle Zeilen und alle Spalten exakt in der Reihenfolge, in der sie im CSV-File stehen? Das kann MySQL auch allein mit LOAD DATA INFILE.

      Falls du die nötigen Berechtigungen nicht hast, musst du es doch mit PHP z Fuß erledigen. Ich sehe allerdings keinen Fehler, der dazu führen würde, dass eine Query mehrmals ausgeführt wird. Das würde nur passieren, wenn fgetcsv() zweimal die selbe Zeile zurückliefert, was es garantiert nicht macht, wenn deine CSV wirklich UTF-8 ist.
      Außerdem würde die Query dann auch zweimal in der Ausgabe erscheinen. Prüfe das mal. Ich bin sicher, das ist nicht der Fall.

      Dein Code lässt sich übrigens deutlich vereinfach.
      PHP-Code:
      $pathCSV 'csv-daten/Funding-Original.csv';

      $handle fopen($pathCSV'r') or die('File not found.');

      $sql 'INSERT INTO tabelle (emittent, allgemein, ...) VALUES';

      while ((
      $data fgetcsv($handle1000';')) !== FALSE){
          
      $sql .= " ('"implode("', '"$data) ."'),";

          
      fclose($handle);

      $sql rtrim($sql',');
      echo 
      $sql;

      mysql_query($sql) or die(mysql_error()); 
      Edit: Wenn TRUNCATE das Problem löst, dann sind die doppelten Einträge vorher schon (einmal) vorhanden. Vermutlich sind auch alle anderen Einträge ohne Umlaute schon da. Aber weil du mysql_error() nicht verwendest, merkst du gar nicht, dass deine Queries ohne Umlaute überhaupt nicht ausgeführt werden und die mit Umlauten nur deshalb, weil die Daten nicht mit den vorhandenen übereinstimmen (bspw. wegen Charset deiner Connection).
      Zuletzt geändert von onemorenerd; 15.12.2010, 12:22.

      Kommentar


      • #4
        Kollation der DB ist UTF8.
        Irrelevant!
        Betrifft suchen, vergleichen, sortieren
        Der Charset der Verbindung ist wichtiger.



        Die Datei hab ich auch in UTF8 gespeichert.
        Ich hoffe du meinst utf-8 ......
        Wir werden alle sterben

        Kommentar


        • #5
          Danke onemorenerd, dein Code ist um einiges einfacher.

          Hab jetzt festgestellt, wenn ich alle Ausgaben (echo, print_r) aus dem Code raus nehme, funktionierte es auch ohne TRUNCATE. Schlauer bin ich deshalb aber immer noch nicht. mysql_error() liefert keine Fehler, alles läuft glatt durch?!?

          Kommentar

          Lädt...
          X