[gelöst] SQL "load data infile" mit mehreren .txt aus ordner

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
carnage
Beiträge: 2
Registriert: 29.06.2012 10:01:51

[gelöst] SQL "load data infile" mit mehreren .txt aus ordner

Beitrag von carnage » 29.06.2012 10:07:59

hey,
ich habe einen ordner mit (teils bis zu mehreren hundert) .txt files diese möchte ich mit dem "LOAD DATA FILE" alle in den selben TABLE laden, habe allerdings derzeit keine ahnung wie ich dies bewerkstelligen soll. der befehl funktioniert mit einem file ganz gut, nur möchte ich eben den kompletten ordnerinhalt (mehrere .txt files) zugleich mit einem befehl laden, ohne diese alle namentlich angeben zu müssen.

bitte um hilfe und danke im voraus.

(debian 6, mysql, alle files (alle .txt) alle im selben ordner)
Zuletzt geändert von carnage am 02.07.2012 09:29:00, insgesamt 1-mal geändert.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: SQL "load data infile" mit mehreren .txt aus ordner

Beitrag von Cae » 29.06.2012 17:30:24

Ich bin da möglicherweise nicht nah genug dran, aber in meiner Vorstellung willst du ein SQL-Skript, was irgendwelche Vorbereitungen macht und dann für jede Datei einen "LOAD DATA FILE"-Abschnitt hat. Richtig?

Code: Alles auswählen

$ cat mksql.sh
#!/bin/sh
cat >sql-script <<EOF
-- irgendwas hier
USE mydb -- oder so
EOF
find . -name '*.txt' -exec 'echo "LOAD DATA FILE {}" >>sql-script' \;
$
Oben, zwischen <<EOF und EOF kannst du irgendwelchen SQL-Krempel eintragen, der am Anfang stehen soll. find schreibt für jedes *.txt im aktuellen Verzeichnis rekursiv (!), also auch in Unterverzeichnissen (-maxdepth, siehe Manpage) einen Eintrag in's Skript.

Willkommen im Forum!

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Methusalix

Re: SQL "load data infile" mit mehreren .txt aus ordner

Beitrag von Methusalix » 30.06.2012 00:39:31

Hallo,
wenn die Daten der txt-Dateien alle in die gleiche Tabelle geschrieben werden sollen, müssen sie auch alle
die gleiche Struktur haben. Ein ganz simpler Ansatz wäre dann, die Dateien erst zu verschmelzen. Also etwa:

Code: Alles auswählen

cat Daten1.txt Daten2.txt [...] > Datenkomplett.txt
bzw. das über eine Schleife zu realisieren und sie dann in mysql einzulesen.
Gruß M.

carnage
Beiträge: 2
Registriert: 29.06.2012 10:01:51

Re: SQL "load data infile" mit mehreren .txt aus ordner

Beitrag von carnage » 02.07.2012 09:27:33

hat sich erledigt. und so hats funktioniert:

Code: Alles auswählen

for item in `ls *.txt`
do
mysql --local-infile -u xxx --password="xxx"<< EOF
use xxx
LOAD DATA INFILE 'xxx/xxx/$item'
INTO TABLE xxx
FIELDS
TERMINATED BY ","
ENCLOSED BY ""
LINES TERMINATED BY "\n";
EOF
echo $item
done
trotzdem danke für die hilfe

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: SQL "load data infile" mit mehreren .txt aus ordner

Beitrag von Cae » 02.07.2012 21:24:57

carnage hat geschrieben:

Code: Alles auswählen

for item in `ls *.txt`
Hint: Das entspricht

Code: Alles auswählen

for item in *.txt
– da braucht man keine Subshell und kein ls.
carnage hat geschrieben:hat sich erledigt. und so hats funktioniert:
Schön!

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] SQL "load data infile" mit mehreren .txt aus or

Beitrag von rendegast » 03.07.2012 01:26:31

Cae hat geschrieben: – da braucht man keine Subshell und kein ls.
Aber ein wichtiger Unterschied:

Code: Alles auswählen

$ for i in `ls *.txt` ; do echo $i ; done
ls: Zugriff auf *.txt nicht möglich: Datei oder Verzeichnis nicht gefunden

$ for i in *.txt ; do echo $i ; done
*.txt
Mit der ls-Formulierung wird die Schleife gerade nicht ausgeführt, wenn kein *.txt da ist.

Mit der ls-Formulierung gibt wieder andere Probleme:

Code: Alles auswählen

$ for i in `ls *.txt` ; do echo $i ; done
aa.txt
bb.txt
cc
dd.txt
Die beiden Probleme berücksichtigt müßte es zumindest

Code: Alles auswählen

ls *.txt   &&   for i in *.txt ; do echo $i ; done
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten