Dieser Blogeintrag hat nicht direkt mit WordPress zu tun, aber WordPress und PHP gehören ja auch zusammen wie der Teufel und das Weihwasser. Einzelne CSV Dateien in eine MySQL Datenbank zu importieren ist nicht sonderlich schwer. Aber wie bekomme ich 600 solcher Dateien mit jeweils 6000 bis 7000 Zeilen und dann auch noch Sonderzeichen und anderem Gedöns in eine MySQL Datenbank? Das klappt hervorragend mit LOAD DATA INFILE mit CSV Dateien.

Nun, ich hab mir die Zeit nicht notiert, aber eine gefühlte Ewigkeit später musste ich feststellen das auch das kein Hexenwerk (mehr?) ist. Dank LOAD DATA INFILE lassen sich große und viele CSV Dateien in einem Rutsch in eine vorbereitete Datenbank importieren. Ich (ja, der Esel) empfehle den verlinkten Beitrag einmal zu studieren, der ist sehr interessant und ich kannte das alles vorher noch nicht, mir sagt ja keiner was.

Gehen wir einmal von folgender Datenbank Tabelle aus:

ID Name Anschrift PLZ Ort 

ergibt sich daraus folgender PHP Code:

$host = "localhost/hostname"; $db_user = "benutzername"; $db_password = "passwort"; $db = "datenbankname"; $con = mysqli_connect($host,$db_user,$db_password,$db);

foreach (glob("/absoluter_pfad_zu_den_dateien/*.csv") as $filename) { $sql = "LOAD DATA INFILE '".$filename."' INTO TABLE euer_tabellenname FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (@Name, @Anschrift, @PLZ, @Ort) SET Name = NULLIF(@Name, 'null'), Anschrift = NULLIF(@Anschrift, 'null'), PLZ = NULLIF(@PLZ, 'null'), Ort = NULLIF(@Ort, 'null')"; }

Eine Fehlerüberprüfung hab ich nicht mit eingebaut, ist aber sehr zu empfehlen. Die fett geschriebenen Namen sind auszutauschen.

Wie die Verbindung zur Datenbank aufgebaut wird will ich hier nicht im Detail erläutern, bzw. steht es ja oben schon beschrieben.
Die foreach Schleife durchsucht den angegeben Ordner nach Dateien mit der Endung csv. Das Sternchen und der Punkt steht für nimm dir jede Datei mit der Endung. Für jede gefundene wird dann der in der Variable $sql angegebene LOAD DATA INFILE Befehl ausgeführt.

Wichtig ist FIELDS TERMINATED BY, hier müsst ihr unbedingt euren Feldtrenner eintragen. Im obigen Beispiel ist das eine Tabulator (\t).

cvs import in libreoffice calc
Beispielhafter cvs import in LibreOffice Calc.

Wenn ihr herausfinden möchtet welchen ihr habt, öffnet die entsprechende Datei z. b. in LibreOffice Calc. Beim öffnen erscheint ein Dialog in welchem die Trennoptionen und die Zeichenketten-Trennung (OPTIONALLY ENCLOSED BY) ausgewählt werden muss. Ebenfalls wichtig ist die Angabe des Zeilenendes, bei mir ist das \n für ein Unix ein Zeilenende. IGNORE 1 LINES lässt die vorhandene Kopfzeile aus, falls bei euch keine in der Datei ist, könnt ihr das weglassen. Wenn das nicht beachtet wird, habt ihr (um bei meinem 600 Dateien Beispiel zu bleiben) 600 mal die Kopfzeile in der MySQL Datenbank stehen, unschön das!

Zum Schluss werden noch die Tabellenfelder angegeben damit die Einträge auch an die richtige Stelle kommen. Falls mal ein Feld leer ist, wird mit NULLIF das betreffende Feld in der Datenbank mit Null aufgefüllt. Das müsst ihr beachten bevor die Daten eingetragen werden! Die ID von ganz oben taucht hier nicht mit auf, da diese AUTO_INCREMENT ist, das heißt sie soll von MySQL automatisch hochgezählt werden damit später eine eindeutige Zuordnung vorhanden ist.

Mit

mysqli_query($con, $sql); 

führt ihr den ganzen kladderadatsch dann aus. Ich begebe mich nach dem Ausführen des Befehls in sichere Entfernung, falls es die Kiste zerlegt, will ich es nicht gewesen sein. Aber das nur am Rande.

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...