Datei einlesen und in MySQL speichern

I

IGU|Schakal

Grünschnabel
Hallo zusammen,
heute brauche ich mal einen Kurs in Sachen Linuxscripting.

Ich möchte folgendes realisieren:
Wöchentlich erhalte ich eine Datei mit ca. 1000-4000 Zeilen. Diese Datei ist folgendermaßen aufgebaut:
Code:
test1 test2 test3
test1 test2 test3
test1 test2 test3
....
Für mich interessant ist die 3. Spalte (Inhalt: "test3) jeder Zeile. Diese soll ausgelesen werden und in eine MySQL Tabelle geschrieben werden.
Das Script soll unter Debian Etch laufen...


Grüsse,
Schakal
 
Hi,

heute brauche ich mal einen Kurs in Sachen Linuxscripting.

http://tldp.org/LDP/abs/html/
Ist ein ganz toller Kurs. ;)

Aber ansonsten ist "cut" dein Freund (man cut fuer mehr infos), und such mal nach "while read" Konstruktionen, dann hast du eigentlich schon alles was du von der Skripting Seite her brauchst.
Wie du mit deinem mysql client jetzt Datensaetze speichern kannst musst du selber rausfinden, aber "man mysql" koennte Aufschluss geben.

mfg,
bytepool
 
Hi bytepool,
so...sieht schon mal nicht schlecht aus:
Code:
cut -d" " -f3 /$src_dir/index.php | while
Nun habe ich aber das Problem, dass ein ^M an der letzten Spalte hängt:
Code:
INSERT INTO test (id, grund) VALUES (null, test^M');
Wie komme ich das noch weg?


Viele Grüße,
Schakal
 
Hi,

Nun habe ich aber das Problem, dass ein ^M an der letzten Spalte hängt:
lass mich raten: die Datei wird unter Windows erstellt, und du bearbeitest das ganze unter Unix? Schau dich mal nach dos2unix oder so um, also einfach ein Programm dass dir vorher noch die end of lines (eol's) umwandelt.

mfg,
bytepool
 
Ob die Datei unter Windows erzeugt wird, weiß ich nicht. Ich lade die Datei nur runter... :-)

Schaut jetz aber gut aus.. :-)
Danke!


Gruss,
Schakal
 
Hi,

im Allgemeinen sollte eine while read Konstruktion auch eher so aussehen:
Code:
while read line; do
   echo $line
done < myfile.txt
Also eine Pipe brauchst du eigentlich erstmal gar nicht. Aber stimmt schon, wenn man "while read" bei google eingibt kommen da teilweise schon komische Sachen bei raus. ;)

edit:
Wobei es in diesem Fall, wenn man eh nur cut benutzen will, wohl auch egal ist.

mfg,
bytepool
 
Zuletzt bearbeitet:
Hallo
While read bearbeitet den Input nacht Trennzeichen, die in der variablen IFS vorgegeben sind.
Code:
while read var1 var2 var3 ;
do
echo "insert command $var3 ...".
done <input
Das sollte reichen

Um das ganze Windowsgedöns rauszubekommen reicht ein :
Code:
sed -e 's/\r//' input >output
Oder eben die sogenannten fertigen Tools wie dos2unix.

Gruß Wolfgang
 
Guten Morgen ihr Zwei,
im Moment sieht mein Script so aus:
Code:
#!/bin/bash

# Variablen
src_dir="tmp"

# MySQL Datebank leeren
echo "TRUNCATE TABLE table;" >> /$src_dir/mysql_dump.sql

# Aktuelle Cheaterliste downloaden
cd /$src_dir/
wget http://www.google.de
dos2unix /$src_dir/index.txt

cut -d" " -f3 /$src_dir/index.txt | while
        read line
        do
        echo "INSERT INTO table (id, name) VALUES (null, '$line');"  >> /$src_dir/mysql_dump.sql
done

mysql -u root -proot -B < /$src_dir/mysql_dump.sql

# Files löschen
rm /$src_dir/mysql_dump.sql
rm /$src_dir/index.txt
Was kann an diesem Script noch noch einfacher bzw. besser gemacht werden?
 
Hi,

naja, einmal koenntest du Wolfgangs Tipp beachten, dass du cut gar nicht brauchst, das war mir auch mal wieder neu.
Ansonsten wuerde ich die Pfad Variable minimal anders definieren. Wenn du schon in das tmp Verzeichnis wechselst, wuerde ich auch hinterher wieder in das Ausgangsverzeichnis zurueck wechseln. Wobei ich das wohl auch komplett ohne "cd" schreiben wuerde.
Und mit ">>" haengst du Dinge nur an Dateien an, d.h. du willst beim ersten Mal vermutlich lieber ">" benutzen, das sollte sicherer sein falls die Dateien zufaellig schon bestehen sollten.

Nach kurzem ueberfliegen wuerde ich jetzt das hier aus deinem Skript machen, ungetestet. Aber wie immer ist vieles davon auch einfach Geschmacksache.

Code:
#!/bin/bash

# Variablen
src_dir="/tmp"

# MySQL Datebank leeren
echo "TRUNCATE TABLE table;" > $src_dir/mysql_dump.tmp.sql

# Aktuelle Cheaterliste downloaden
wget http://www.google.de -O $src_dir/index.tmp.txt

dos2unix $src_dir/index.tmp.txt

while read var1 var2 var3; do
	echo "INSERT INTO table (id, name) VALUES (null, '$var3');"  >> $src_dir/mysql_dump.tmp.sql
done < $src_dir/index.tmp.txt

mysql -u root -proot -B < $src_dir/mysql_dump.tmp.sql

# Files löschen
rm $src_dir/mysql_dump.tmp.sql
rm $src_dir/index.tmp.txt

mfg,
bytepool
 
Hi,
vielen, vielen Dank. Jetzt sieht das schon übersichtlicher aus. :-)


Gruss,
Schakal
 

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Zurück
Oben