# MySQL Batch Import von mehreren CSV Dateien



## hamst0r (22. Januar 2017)

Hallo,

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

Die Query

```
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.


```
@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

```
"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


----------



## forenshit (22. Januar 2017)

For do:  (For - Loop through files | Windows CMD | SS64.com). 
Definiere die %%I vor der Schleife.

Oder versuche es mit "forfiles" (Forfiles - Batch process multiple files | Windows CMD | SS64.com).


----------



## hamst0r (22. Januar 2017)

Führe ich die Schleife ohne den mysql Befehl durch, funktioniert sie.

```
@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

```
[COLOR=#000000]LOAD DATA LOCAL INFILE '"%%I"' REPLACE ...
```
Probleme.


----------



## forenshit (22. Januar 2017)

Du kannst keine Variablen in "Load data local infile" benutzen. Lese: MySQL :: MySQL 5.6 Reference Manual :: 13.2.6 LOAD DATA INFILE Syntax.

"You can't use a variable for the path. You have to code a literal, quoted string into the statement before it is parsed."


----------



## forenshit (22. Januar 2017)

Hier noch als Well Know-how Bug MySQL Bugs: #39115: Permit a variable in filename parameter of LOAD DATA INFILE


----------



## hamst0r (23. Januar 2017)

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.


----------



## hamst0r (27. Januar 2017)

Ich habe zwar keine direkte Lösung gefunden, aber einen Weg, der auch funktioniert.


```
@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.

```
"E:\Program Files (x86)\xampp\mysql\bin\mysql.exe" -u root -p datenbank < import.txt
```


----------



## forenshit (27. Januar 2017)

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.


----------

