Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von xxeon, 24.03.2014.

  1. #1 xxeon, 24.03.2014
    Zuletzt bearbeitet: 25.03.2014
    xxeon

    xxeon Grünschnabel

    Dabei seit:
    24.03.2014
    Beiträge:
    4
    Zustimmungen:
    0
    Ort:
    Wien
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 xxeon, 25.03.2014
    Zuletzt bearbeitet: 25.03.2014
    xxeon

    xxeon Grünschnabel

    Dabei seit:
    24.03.2014
    Beiträge:
    4
    Zustimmungen:
    0
    Ort:
    Wien
    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;
    
     
  4. xxeon

    xxeon Grünschnabel

    Dabei seit:
    24.03.2014
    Beiträge:
    4
    Zustimmungen:
    0
    Ort:
    Wien
    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 .....
     
  5. xxeon

    xxeon Grünschnabel

    Dabei seit:
    24.03.2014
    Beiträge:
    4
    Zustimmungen:
    0
    Ort:
    Wien
    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
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Die Seite wird geladen...

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql - Ähnliche Themen

  1. Prblem mit licq

    Prblem mit licq: Hallo Leute, :hilfe2: ich hoffe mir kann einer helfen, ich bin suse 10.3 nutzer und möchte licq nutzen. Instaliert hab ich das schon nur bekomme...
  2. LFS glibc Prblem

    LFS glibc Prblem: Hi Leute, ich bin grade dabei lfs zu basteln und habe beim Erstellen von glibc 2.3.6 folgenden Fehler erhalten: In file included from...