Sie sind nicht angemeldet.

1

23.02.2009, 22:38

CSV Export mit Bash bearbeiten

Hallo Forum,

ich habe ein kleines Problem und es wäre schön wenn jemand hierzu etwas sagen kann. Ich habe eine CSV Datei die ich bearbeiten muss hier meine TODO Liste

1. Ffeld 3, 4 und 5 zusammenfassen zu einem Feld jeodch nicht in der ersten Zeile dort nur die überflüssig geworden Felder löschen
2. Telefonnummern Konventieren also aus 09721 soll +499721 werden
3. Email Validieren - wenn die Emailadress nicht Valide ist entfernen

Es kann noch mehr dazu kommen jedoch ist dies erstmal stand der Dinge.

Ich habe herrausbekommen wie man Felder auslassen kann jedoch habe ich dann kein Trennzeichen mehr!

Quellcode

1
awk -F ';' 'NR == 1 {print $1,$2,$3,$6,$7,$8,$9,$10,$11}'


Wie muss ich das behandeln? In einer Variable Speichern und via tr das Trennzeichen erneut setzen?

Es wäre schon wenn mir jemand, der schon erfahrungen mit solchen dingen machen durfte sich zu wort melden würde...

WIe ich die EMailadresse Prüfen kann und die Telefonnummer und Faxnummer Konventieren - da steh ich grad etwas auf dem schlauch
Wenn ihr postet, wäre ein passender Link sehr schön - um mich da einzuarbeiten - DANKE!

Bin für jede hilfe Dankbar
knasan

- Bug oder Feature, das darf man sich hier aussuchen. -

2

24.02.2009, 00:19

Hallo!

Also mit Bash bin ich selber nicht so erfahren.
Aber ich würde dir raten, wenn es nicht unbedingt bash sein muss, lieber auf eine Script-Sprache um zu steigen. Natürlich ist die Bash mächtig genug um vermutlich alles irgendwie um zu setzen, was du machen möchtest, aber Perl, Python oder ähnliches sind doch sehr viel leichter les- und schreibbar.

Gruß H2
"...klingt komisch, ist aber so!"

3

24.02.2009, 13:05

Eine andere Programmiersprache kommt jetzt erstmal nicht in frage. Aber wenn das Script fertig ist steht nix im weg mal darüber zu reden wie man dies hätte machen können mit perl python und co - wäre mal interessant

ich habe grad ein Problem, damit ich die CSV schön bearbeiten konnte habe ich diese in mehreren gruppen zerteilt und als seperates tmp-file geschrieben. Nur jetzt muss ich diese files wieder zusammen fügen jedoch nebeneinander.

Was auch wichtig ist, als Trenner muss ein Tabstop verwendet werden also 0x09 bzw \t

gerade weiß nicht wie man das genau macht - hoffe von euch jemand evtl. eine lösung kennt.
knasan

- Bug oder Feature, das darf man sich hier aussuchen. -

4

24.02.2009, 13:42

Zitat

1. Ffeld 3, 4 und 5 zusammenfassen zu einem Feld jeodch nicht in der ersten Zeile dort nur die überflüssig geworden Felder löschen


Was genau meinst du mit zusammenfassen ? den trenner der felder löschen so das aus "AA BB" , "AABB" wird ? oder willst du sie rauslöschen? (das bewirkt ja der von dir gepostete awk befehl)

Zitat

2. Telefonnummern Konventieren also aus 09721 soll +499721 werden


Quellcode

1
sed  's/09721/+499721/g



Zitat

3. Email Validieren - wenn die Emailadress nicht Valide ist entfernen


du willst den string auf gültige zeichen prüfen, habe ich das richtig verstanden ?
Intel core 2 duo E6600
XFX Geforce 7950 gt
4096 MB DDR2
Intel DP35DP

5

24.02.2009, 15:08

Naja, weist du: am 8. Tag hat sich der liebe Gott über genau sowas so mächtig doll arg geärgert, das er uns da Perl geschenkt hat um sowas zu machen. Und seitdem sind alle wirklich echt froh und gut drauf damit. =)

Aber auf der Shell ...

1. Wegen Felder anzeigen, Steuerzeichen (bsp. TAB), Delimiter oder nicht:

Quellcode

1
2
$ echo 'Das;ist;ein;Satz;mit;vielen;echt;vielen;Feldern!' | awk -F ';' '{ printf("%s %s\t\t\t\t%s ... %s-%s-%s .... %s%s%s%s%s%s\n", $1, $2, $3, $4, $4, $4, $4, $5, $6, $7, $8, $9, $10, $11); }'
Das ist                         ein ... Satz-Satz-Satz .... SatzmitvielenechtvielenFeldern!
Kannst du mit dem Beispiel was anfangen?

2. Telefonnummern: sed mit Regulär Ausdrücke, wie es mein Vorposter schon andeutete.

3. Email-Addressen validieren: Regülare Ausdrücke (vlt. mit grep) auf die Syntax, bei der Addressgültigkeit selber kannst du nur den HOST pingen, und nicht mal das ist sicher, da einige FWs Pings blocken.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

6

24.02.2009, 15:49

ja ja Perl damit habe ich mal angefangen aber nur sehr kurz und Bash musste ich in der schule etwas lernen - aber perl reizt mich schon lange :D

Danke für eure antworten, auch wenn ich vieles erst gelesen habe wenn ich schon fast oder sogar fertig war -- vielen dank dafür

ich bin grad über die telefonnummern dort ist leider nicht alles deutschland sondern alles quer pet - es wurde leider auch nicht immer das format eingehalten

was ich bräuchte wäre eine funktion die mir sagt alles was mit einer null beginnt mach draus +49 und alles was 00 lassen außer wenn es 0049 ist
ist sowas mit sed realisierbar ?

Danke
knasan

- Bug oder Feature, das darf man sich hier aussuchen. -

7

24.02.2009, 17:08

Quellcode

1
2
echo "0123,00123,0049123,00231,08734" | sed -e 's/0049/+49/g;s/,0[^0]/,+49/g'
0123,00123,+49123,00231,+49734



wobei dies nicht das erste vorkomnis beinhaltet,sofern es sich am anfang befindet .. weil im ausdruck nach "," gesucht wird , wenn das nicht dabei ist trifft es auf jede "0" zu
Intel core 2 duo E6600
XFX Geforce 7950 gt
4096 MB DDR2
Intel DP35DP

8

24.02.2009, 17:24

was ich bräuchte wäre eine funktion die mir sagt alles was mit einer null beginnt mach draus +49 und alles was 00 lassen außer wenn es 0049 ist
ist sowas mit sed realisierbar ?


Ich denke, das läßt sich mit sed lösen ... so stufenweise irgendwie

Quellcode

1
2
3
4
5
6
7
8
9
10
$ cat t
+49 / (0)888 / 2345-345
0049888 2345 DW 345
0888 2345 Klappe 345
0043 9876 6543
$ cat t | sed "s/ //g" | sed "s/(0)//g" | sed "s/^\+/00/" | sed "s/^0\([1-9]\)/0049\1/" | sed "s/[^0-9]//g"
00498882345345
00498882345345
00498882345345
004398766543


Also:
* zuerst alle Leerzeichen kicken,
* dann alle "(0)" rausschmeissen
* tausche alle "0irgendwas" in ein "0049irgendwas"
* entferne all nicht-zahlen

Ich denke so kann man eine Reihe von Fällen mal erschlagen. Alle erwischt man sicher so auch nicht.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

9

25.02.2009, 14:30

Okay das ist fakt!

Das Script was ich geschrieben habe funkioniert schon mal sehr gut dank eure hilfe. Jedoch in einen Punkt habt ihr recht, bash ist halt leider nicht so mächtig das man damit alles realisieren kann. Ich stehe jetzt an einem Punkt wo ich mir überlege das alles doch umzuwerfen und eine andere Programmier-(Skript)Sprache zu verwenden.

Habe mir Perl angesehen (ein buch habe ich hierüber) und muss sagen es halt wirklich super funktionen sowie zum beispiel @sort

Ich gehe mal davon aus, das man auch in PERL awk und sed verwenden kann (bzw. alle externe Kommandos was Linux so anbietet)

Welche schnelle und einfache Dokumentation könnt ihr für PERL empfehlen um mein vorhaben zu realiseren?
Ist es möglich die CSV datei gesplittet als ARRAY einzulesen?
also jede felder (trenner ;) um diese weiter zu bearbeiten - evlt. gibt es eine bessere lösung!

Wichtig, die ausgabe muss später wieder zusammen geschrieben werden und als trenner ein tabstop verwendet werden
(ich kenne nur die Lösung mit paste)

Aber das schwirigste für ich scheint grad zu sein das die CSV unterschiedliche anzahl von ; (trenner) haben

etwa so

Quellcode

1
ArtikelNr;ArtikelBez;;;telefon;fax;;;;;;email;;;;;;;;;;;

und

Quellcode

1
ArikelNR;ArtikelBez;telefon;;;;;fax;email;;;;;;


Deswegen bekomme ich mit bash immer wieder mal Probleme da ich mit grep gearbeitet habe und somit der schalter -f immer eine andere zahl benötigt.

Okay, wenn man die meisten meine Fragen (Falls verstanden) mit ja beantworet werden können oder evlt. jemand einen bessere IDEE hat - kann könnt ihr anfagen PERL Dokumentationen zu posten damit ich mich schnell einarbeiten kann - aber ich denke hilfe werde ich dann noch brauchen!

Danke an alle die mir bisher geholfen haben
knasan

- Bug oder Feature, das darf man sich hier aussuchen. -

10

25.02.2009, 14:58

ich habe zwar keine ahnung von perl .. aber wieso ersetzt du nicht am anfang alle trenner mit einem neuen ... ? dann stimmt die anzahl, und dann kannst du damit arbeiten
Intel core 2 duo E6600
XFX Geforce 7950 gt
4096 MB DDR2
Intel DP35DP

11

25.02.2009, 15:28

Also ich würde eher mal in Erfahrung bringen, warum eine verschiedene Anzahl von Trennern drin vorkommt...

Letztendlich gibt es in fast jeder Programmiersprache den befehl "split" dem man das trennzeichen übergeben muss, danach bekommt mein ein array mit all seinen werten zurück...

wenn die anzahl der trennzeichen nicht immer gleich ist, bekommst du in jeder programmiersprache das problem, nicht zu wissen was an welcher stelle im array steht.
Hier muss man dann eine gewisse logik einprogrammieren um herauszufinden ob es sich auch wirklich um eine email und nicht um eine telefonnummer oder ähnliches handelt.

Ich denke, alle deine probleme sollten mit ein wenig awk und sed schnell zu lösen sein. Perl is sicher in manchen aufgaben viel besser...

ich persönlich liebe aber die unix befehle so sehr, weil man einfach ohne viel zu denken fast jede ausgabe irgendwie in ein anderes programm pipen kann und wenn man da ein wenig fix ist, kann man ruckzuck kleine aufgaben schnell in der schell erfüllen erfüllen

http://www.pdf-search-engine.com


Hier kannst du mal nach allerhand tutorials und ebooks suchen... zu awk und sed findest sehr viel, ebenfalls zu perl, oder mein favorit python...

Quellcode

1
2
date ; unzip | port ; touch | head ; strip | top ; finger socket ; 
grep ; mount | tail ; gasp < yes & yes ; umount ; sleep