Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

xxeon

Grünschnabel
Beiträge
4
Hallo

Eventuell kann mir jemand bei meinem Problem helfen. Ich habe mich irgendwie total verrannt und komme nicht weiter.
Die folgende Beschreibung dient zum verständniss des Ablaufes.
Verwendet werden : Debian Wheezy , 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
sowie Bash jedoch mysql in der nicht Debian Version 5.6.16 von der Oracle Comunity Version.

Ablauf :

1:
Es werden Textdatei in der die Werte mit | getrennt sind angeliefert. (das funktioniert ja haha)
so sehen die aus: bisher jeweils eine zeile
Code:
70||232128320213311|C2189C05|2810238512|C2189D0A|eety.at|1|21|A00680040AB22009|255||20140303151418|182|0|8388872|1797263272|vie2flexing1||475316591|0|4368183168550|91|00||||32F250||3541930278021837|2|1024|2|0|32F250||||0|||1|20140303151418|20140303151720|182|13019119744|021B621F7396737374830000|C2189D0A|32F250|50351|570797|20140303151720|2||0||||||dwh_947640_20140303151818.cdr|00001042|11
2:
Die files werden wenn sie älter als 2 minuten sind einmal kopiert (das holt der Backup client dann ab)
sowie einmal verschoben und entpackt (funktioniert auch)
3:
es werden 6 Werte aus den dateien gelesen und in eine MYsql Tabelle geschrieben .
(funktioniert auch bislang)
4:
Die datei nach dem Durchlauf gelöscht (funktioniert auch)
So sieht das script aus :
Code:
#!/bin/sh
#  Verschiebt alles CDRS älter als 2min  einmal ins Backup verzeichniss 
# und einmal ins process verzeichniss packt dort aus 
# und liest die 6 werte in die DB ein 
# löscht nach einlesen die  CDRS
# modified by HB XXeon  13.3.2014

#sdir = quellverzeichniss
#bdir = backupverzeichniss
#pdif = processverzeichniss  zum einlesen in datenbank

sdir="/var/www/eetycdr"
bdir="/var/cdr/backup"
pdir="/var/cdr/insert"

        find "$sdir" -type f  \( -name '*.gz' \) -mmin +2  -exec cp {} "$bdir" \; -exec mv {} "$pdir" \; 
                cd "$pdir"
                        gunzip *.gz
    IFS="

    ";
    for i in "$pdir"/*.cdr;
     do
         a=`cat "$i" | awk -F"|" '{print $3}'`;b=`cat "$i" | awk -F"|" '{print $13}'`;c=`cat "$i" | awk -F"|" '{print $14}'`;d=`cat "$i" | awk -F"|" '{print $22}'`;e=`cat "$i" | awk -F"|" '{print $50}'`;f=`cat "$i" | awk -F"|" '{print $51}'`;

 mysql -h localhost -u someuser --password=omeowd -D somedb -e "insert into cdrs (sServedImsi,sRecordOpeningTime,sDuration,sServedMsisdn,sUplinkVolume,sDownlinkVolume) VALUES ('$a','$b','$c','$d','$e','$f');"

        rm "$i"
done;

Seit einigen tagen werden jedoch Dateien eingeliefert die mehr als eine Zeile haben.
Das Script funktioniert jedoch aufgrund des cat nur jeweils mit der ganzen Datei , dh
ich bekomme bei mehr als einer Zeile den Fehler " Data Truncated" aus der Datenbank zurück und es wird nichts geschrieben.
Kann mir Bitte jemand auf die Sprünge helfen bitte ,Ich habe es auch schon mit verschiedenen awk Befehlen versucht, bekomme aber dann den zielt wert , also $3 $13 usw nicht als einzelwert zum schreiben in die Datenbank.
Vielen Dank im voraus
hb
 
Zuletzt bearbeitet:

xxeon

Grünschnabel
Beiträge
4
prinzipiell geht es so (test mit nur 2 Werten) ... aber schön ist das nicht , und er wirft jetzt SQL Fehler
Code:
RROR 1364 (HY000) at line 1: Field 'sServedMsisdn' doesn't have a default value
Das Value stimmt aber und mit cat hat das auch funktioniert.

hat wer eine bessere Idee ?
Code:
pdir="/var/cdr/insert"

        for i in "$pdir"/*.cdr;
                do
                for line in `cat "$i"` ;do
                          a=` echo "$line" | awk -F"|" '{print $3}'`
                          b=` echo "$line" | awk -F"|" '{print $13}'`
        mysql -h localhost -u someuser --password=omeowd -D somedb -e "insert into cdrs (sServedImsi,sRecordOpeningTime) VALUES ('$a','$b')"
                done;
        done;
 
Zuletzt bearbeitet:

xxeon

Grünschnabel
Beiträge
4
ok geht so auch nicht, das mysql query kann nur im ganzen abgesetzt werden kann .
dh es müssen alle 6 Werte in einem query in die Datenbak geschrieben werden.
bei obigen beispiel werden aber die werte der Reihe nach geschrieben , zurst a , dann b usw , daher kommen auch die Mysql Fehler , dies ist
nicht zulässig (hier explizit eben nicht )

no jetzt wird aber fad .....
 

xxeon

Grünschnabel
Beiträge
4
so freunde
Danke für die Hilfe ist gelöst
Da die Datenbank in diesem Falle NUR alle werte aufeinmal in einem Query wollte , und ich grade unter extremen
Zeitdruck stehe habe ich einfach eine "while Read line " Schleife reingebastelt und die werte mit awk in ein bash array geschrieben
welche dann von mittels insert into direkt in die Felder der DB geschrieben werden , egal auch wieviel Zeilen jetzt drinnen stehen .

Sieht zwar jetzt nach "Coding gelernt bei Yoda du hast" aus aber für schönheiten habe ich jetzt keine Nerven.

Thema kann auf gelöst gesetzt werden
 

Ähnliche Themen

sed in awk

Zeilen behalten, die Werte in einem bestimmten Bereich enthalten

Shell Skript beschleunigen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

Oben