Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Textdatei auslesen und in MySQL DB einfügen?
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
igno2k
n00b
n00b


Joined: 13 Mar 2004
Posts: 29

PostPosted: Sat Jul 29, 2006 3:02 pm    Post subject: Textdatei auslesen und in MySQL DB einfügen? Reply with quote

Hallo zusammen,

habe ein kleines Problemchen. Und zwar habe ich hier eine Username / PW Datei vor mir liegen, die in eine MySQL DB eingefügt werden soll.
Das ganze soll wenn möglich per Bash Script geschehen. Nur leider bin ich in Sachen Bash Scripting noch nicht so auf der Höhe.

Hier erstmal ein Auszug aus der Textdatei:

Code:

==================================================
Index             : 1
Protocol          : POP3
User              : hans
Password          : hanshans
==================================================

==================================================
Index             : 2
Protocol          : POP3
User              : pmustermann
Password          : =8932ldo.
==================================================


Einige Informationen wie z.B. Index und Protocol sind unwichtig; andere unwichtige Werte habe ich der Übersicht wegen weggelassen. Nur User & Password sollen ausgelesen werden und in eine DB geschrieben werden. Denkbar wäre auch das Einfügen in eine andere Datei mitsamt der MySQL Abfragen, so dass es später direkt in der MySQL Shell bzw. per phpMyAdmin in eine DB eingefügt werden kann.

Vielleicht kann mir ja jemand auf die Sprünge helfen, wie ich solch eine Datei richtig auslesen kann.

Vielen Dank
igno
Back to top
View user's profile Send private message
flash49
Apprentice
Apprentice


Joined: 12 Feb 2005
Posts: 233

PostPosted: Sat Jul 29, 2006 4:24 pm    Post subject: Reply with quote

Ich hab mal ein kleines awk Programm geschrieben, was dir den File in einen CVS-File (durch Komma getrennte Daten) umwandelt, die du in phpmyadmin verwenden können solltest. Aufgerufen wird das ganze mit "awk -f programm.awk daten.txt"
programm.awk:
Code:
BEGIN { RS = "=+" ; FS = "\n" ;RS = "" ; FS = "\n" }
{
      match ($4 ,/(User.*)\:[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
      match ($5 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
      OFS = ""
      print "'",arr[2],"','",arr2[2],"'"
}
END{ RS = "" ; FS = "\n" ; RS = "=*" ; FS = "\n"  }

Quote:
~ $ awk -f programm.awk daten.txt
'hans','hanshans'
'pmustermann','=8932ldo.'
Back to top
View user's profile Send private message
igno2k
n00b
n00b


Joined: 13 Mar 2004
Posts: 29

PostPosted: Sat Jul 29, 2006 4:59 pm    Post subject: Reply with quote

Super Danke!

Leider gibt mir das Programm bei dem genannten Beispieldatensatz nur Folgendes aus:

Code:

awk -f test.awk test
'hans','hanshans'


Die Datei "test" wird auch nicht verändert - somit leider keine CSV Datei.

Mit der Original Datei bekomme ich folgendes Ergebnis:
Code:

awk -f test.awk pws.txt
'',''
'',''
'',''
'',''
'',''
'',''
'',''
'',''


Die Zeichenfolge "," entspricht in etwa der Anzahl der Datensätze in der Datei pws.txt. Datei pws.txt wird auch nicht verändert.

Zur Übersicht habe ich hier noch einmal einen kompletten Datensatz:

Code:

==================================================
Index             : 1
Protocol          : POP3
Local Address     : 67.80.92.45
Remote Address    : 128.8.45.4
Local Port        : 17019
Remote Port       : 110
User              : dsfdsfd21
Password          : ysfdsf22
Capture Time      : 28.07.06 17:03:38
==================================================


Der Ansatz scheint schon wirklich gut zu sein. Evtl. fällt dir ja ein, woran es liegen könnte.
Ich werde mich mal ein bisschen mit awk beschäftigen - evtl. schaff ichs ja auch selbst ;)

Gruß
igno
Back to top
View user's profile Send private message
think4urs11
Bodhisattva
Bodhisattva


Joined: 25 Jun 2003
Posts: 6659
Location: above the cloud

PostPosted: Sat Jul 29, 2006 6:14 pm    Post subject: Reply with quote

Falls jemand mal ein abschreckendes Beispiel braucht, das ganze geht auch mit sed

Code:
ich@pc ~$ sed -f ./extrakt ./rohdaten
"hans","hanshans"
"pmustermann","=8932ldo."
"dsfdsfd21","ysfdsf22"
ich@pc ~$


./extrakt:
:loop
$!{
N
/^User.*\nPassword.*$/{
s/\nPassword/,/
b loop
}
s/\(User.*: \)\(.*\)/\"\2\",/
s/\n\(Password.*: \)\(.*$\)/\"\2\"/
/^\"/P
D
}
/^=====/D


./rohdaten:
==================================================
Index             : 1
Protocol          : POP3
User              : hans
Password          : hanshans
==================================================

==================================================
Index             : 2
Protocol          : POP3
User              : pmustermann
Password          : =8932ldo.
==================================================

==================================================
Index             : 1
Protocol          : POP3
Local Address     : 67.80.92.45
Remote Address    : 128.8.45.4
Local Port        : 17019
Remote Port       : 110
User              : dsfdsfd21
Password          : ysfdsf22
Capture Time      : 28.07.06 17:03:38
==================================================


Viel Spaß beim Entschlüsseln der sed statements :roll:

HTH
T.
_________________
Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself
Back to top
View user's profile Send private message
flash49
Apprentice
Apprentice


Joined: 12 Feb 2005
Posts: 233

PostPosted: Sat Jul 29, 2006 6:38 pm    Post subject: Reply with quote

igno2k wrote:
Super Danke!

Leider gibt mir das Programm bei dem genannten Beispieldatensatz nur Folgendes aus:

Code:

awk -f test.awk test
'hans','hanshans'


Wenn es nur EIN Datensatz ist, dann sollte er auch genau das ausgeben. Wenn die Ausgabe stimmt leitest du die einfach in eine Datei um
Code:
awk -f test.awk eingabe > ausgabe



igno2k wrote:

Mit der Original Datei bekomme ich folgendes Ergebnis:
Code:

awk -f test.awk pws.txt
'',''
'',''
'',''
'',''
'',''
'',''
'',''
'',''


Die Zeichenfolge "," entspricht in etwa der Anzahl der Datensätze in der Datei pws.txt. Datei pws.txt wird auch nicht verändert.

Zur Übersicht habe ich hier noch einmal einen kompletten Datensatz:

Code:

==================================================
Index             : 1
Protocol          : POP3
Local Address     : 67.80.92.45
Remote Address    : 128.8.45.4
Local Port        : 17019
Remote Port       : 110
User              : dsfdsfd21
Password          : ysfdsf22
Capture Time      : 28.07.06 17:03:38
==================================================


Der Ansatz scheint schon wirklich gut zu sein. Evtl. fällt dir ja ein, woran es liegen könnte.
Das Problem ist ziemlich einfach erklärt: Deine Originaldaten enthalten pro Eintrag mehr Zeilen, als dein erstes Beispiel und mein Programm hab ich auf das erste Beispiel abgestimmt. Da waren Username und Passwort in den Zeilen 4 und 5 eines Eintrags, jetzt sind es 8 und 9!
Wenn du das $4 durch $8 und das $5 durch $9 ersetzt sollte es gehen.
igno2k wrote:


Ich werde mich mal ein bisschen mit awk beschäftigen - evtl. schaff ichs ja auch selbst ;)

Gruß
Reguläre Ausdrücke (Das, was bei awk in den beiden "//" drin steht) solltest du dir aber auch ansehen, da das der Trick bei der Sache ist.
Ich habe das Programm noch so verbessert, daß es nur noch 2 Voraussetzungen hat:
1. In einer Zeile steht der Beutzername ($1) und in der Zeile direkt danach steht das Passwort($2)
2. Einen Daten zeile sieht so aus: "Bezeichner : Wert", mit jeweils beliebig vielen Leerzeichen oder TABs dazwischen
Programm funktioniert so nicht richtig, Korrektor siehe unten
Code:
BEGIN { FS = "\n" }
{
      matched=match ($1 ,/(User.*)\:[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
      match ($2 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
      OFS = ""
      if (matched)print "'",arr[2],"','",arr2[2],"'"
}


Edit:
@Think4UrS11
Im Prinzip macht dein Programm genau das, was meine 2 Programmversion macht, nur das awk den äußeren loop nicht braucht, da es eh die Datei Zeilenweise durchgeht.


Last edited by flash49 on Sat Jul 29, 2006 7:03 pm; edited 1 time in total
Back to top
View user's profile Send private message
flash49
Apprentice
Apprentice


Joined: 12 Feb 2005
Posts: 233

PostPosted: Sat Jul 29, 2006 7:00 pm    Post subject: Reply with quote

In meinem Programm ist noch ein kleiner Denkfehler drin gewesen, das hier sollte funktionieren:
Code:
BEGIN { RS="User[^:]*:" ; FS = "\n" }
{
      matched=match ($1 ,/[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
      match ($2 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
      OFS = ""
      if (matched)print "'",arr[1],"','",arr2[2],"'"
}
Back to top
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Sat Jul 29, 2006 8:49 pm    Post subject: Reply with quote

verschoben nach Diskussionsforum
Back to top
View user's profile Send private message
igno2k
n00b
n00b


Joined: 13 Mar 2004
Posts: 29

PostPosted: Sun Jul 30, 2006 8:25 am    Post subject: Reply with quote

Super Leute!

Beide Programme funktionieren :)

Ich werde den Code dann noch ein bisschen an meine Bedürfnisse anpassen und mich weiter mit sed und awk beschäftigen, um solche Fragen zu vermeiden :roll:


Grüße
igno
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum