MySQL Batch Import von mehreren CSV Dateien

hamst0r

PC-Selbstbauer(in)
Hallo,

ich möchte automatisch alle CSV-Dateien aus einem Ordner über ein Batch Script in eine MySQL Datenbank importieren.

Die Query
Code:
LOAD DATA LOCAL INFILE 'G:\\Eigene Dateien\\Desktop\\Datei.csv' REPLACE INTO TABLE `datenbank`.`test` CHARACTER SET latin1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (@dummy, @dummy, `Spalte1`, @dummy, `Spalte2`, @dummy, @dummy, `Spalte3`, `Spalte4`, `Spalte5`, `Spalte6`, `Spalte7`, @dummy, @dummy, `Spalte8`, @dummy, `Spalte9`, `Spalte10`, `Spalte11`, `Spalte12`, `Spalte13`, `Spalte14`);
funktioniert auch für eine einzelne Datei.

Nun möchte ich das für alle CSV Dateien in einer for-Schleife automatisieren.

Code:
@ECHO off
FOR %%I IN ("G:\\Eigene Dateien\\Desktop\\*.csv") DO (
echo %%I
"E:\Program Files (x86)\xampp\mysql\bin\mysql.exe" -e "LOAD DATA LOCAL INFILE '"%%I"' REPLACE INTO TABLE `datenbank`.`test` CHARACTER SET latin1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (@dummy, @dummy, `Spalte1`, @dummy, `Spalte2`, @dummy, @dummy, `Spalte3`, `Spalte4`, `Spalte5`, `Spalte6`, `Spalte7`, @dummy, @dummy, `Spalte8`, @dummy, `Spalte9`, `Spalte10`, `Spalte11`, `Spalte12`, `Spalte13`, `Spalte14`);" -u root --password=<passwort> <datenbank>
)
PAUSE
Oder gibt es einen allgemeinen Fehler in der Vorgehensweise?


Auch
Code:
"E:\Program Files (x86)\xampp\mysql\bin\mysql.exe" -e "LOAD DATA LOCAL INFILE 'G:\\Eigene Dateien\\Desktop\\Datei.csv' REPLACE INTO TABLE `datenbank`.`test` CHARACTER SET latin1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (@dummy, @dummy, `Spalte1`, @dummy, `Spalte2`, @dummy, @dummy, `Spalte3`, `Spalte4`, `Spalte5`, `Spalte6`, `Spalte7`, @dummy, @dummy, `Spalte8`, @dummy, `Spalte9`, `Spalte10`, `Spalte11`, `Spalte12`, `Spalte13`, `Spalte14`);" -u root --password=<passwort> <datenbank>
funktioniert.
Jedoch nicht mehr in Verbindung mit der Schleife
 
Zuletzt bearbeitet:
Führe ich die Schleife ohne den mysql Befehl durch, funktioniert sie.
Code:
@ECHO off
FOR %%I IN ("G:\\Eigene Dateien\\Desktop\\*.csv") DO (
echo %%I
)
PAUSE
Es werden die CSV Dateien inklusive Pfad ausgegeben.

Scheinbar macht das
Code:
[COLOR=#000000]LOAD DATA LOCAL INFILE '"%%I"' REPLACE ...
Probleme.
 
Vielen Dank, eine Lösung konnte ich bisher aber noch nicht zusammenbasteln. Wie würde der Befehl mit forfiles denn aussehen? Wäre das nicht auch eine Variable?

Ansonsten wäre ich auch über Datenbanksoftware dankbar, mit der man automatisch so viele Dateien auf einmal importieren kann. Ich hätte mir ein kurzes Batch Script nur am einfachsten vorgestellt.
 
Ich habe zwar keine direkte Lösung gefunden, aber einen Weg, der auch funktioniert.

Code:
@ECHO offFOR %%I In ("G:\\Eigene Dateien\\Desktop\\*.csv") DO (
echo LOAD DATA LOCAL INFILE '%%I' REPLACE INTO TABLE `datenbank`.`test` CHARACTER SET latin1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES ^(`Spalte1`, `Spalte2`, ..., `Spalte22`^)^;>> import.txt
)
echo Done
PAUSE >NUL

Den Inhalt aus der erzeugten import.txt lese ich mit einem anderen Batch Script ein.
Code:
"E:\Program Files (x86)\xampp\mysql\bin\mysql.exe" -u root -p datenbank < import.txt
 
Freut mich, dass ich dir helfen konnte. Das sieht schon gut aus, aber vielleicht kann ich dir noch einen anderen Weg vorschlagen.

Du könntest in der for-Schleife die .csv Dateien finden und ein Copy and Rename, auf z.B. tempdb.csv, machen. Dann die so erzeugte tempdb.csv mit load data local infile 'tempdb.csv' in die DB exportieren. Hier kannst du die tempdb.csv löschen (zuvor vielleicht nach Fehler beim Export untersuchen) und zum Anfang der for-Schleife kehren. Natürlich eine .csv Datei nach der anderen. Auch eine Fehlermeldung mit if then (Fehler bei: Export, Copy and Rename und Suche der .csv Dateien) kannst so einbauen. Und das alles in nur einer Batchdatei.
 
Zurück