ubuntuusers.de

Rohdaten automatisch in vCards umwandeln

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

LinusNichtTorvalds

Avatar von LinusNichtTorvalds

Anmeldungsdatum:
7. August 2008

Beiträge: 1626

Wohnort: /dev/hardcore

N'Abend,

ich habe ein kleines Problem, das ich gerne mit einem Script lösen möchte, da der Aufwand für eine manuelle Abarbeitung zu groß ist.

Ich habe aus einem Programm an die 500 Adressdaten exportiert. Leider ist das Programm etwas veraltet und exportiert die Daten nur als .txt-Datei. Ich möchte diese Adressdaten in ein neues Programm importieren, welches leider nur den Import aus .vCard-Dateien erlaubt.

Die Daten liegen im folgenden Format vor:

Vorname1;Nachname2;mail1@anbieter1.de
Vorname2;Nachname2;mail2@anbieter2.de

Es gibt bei dem veralteten Programm allerdings einige Einstellungsmöglichkeiten, z. B. ließe sich die Reihenfolge verändern oder als Trennzeichen ";" ein anderes Zeichen verwenden.

Das vCard-Format sieht (Laut Wikipedia: http://de.wikipedia.org/wiki/VCard) so aus:

BEGIN:VCARD
VERSION:3.0
N:Nachname1;Vorname1
FN:Vorname1 Nachname1
EMAIL;TYPE=INTERNET:mail1@anbieter1.de
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Nachname2;Vorname2
FN:Vorname2 Nachname2
EMAIL;TYPE=INTERNET:mail2@anbieter2.de
END:VCARD

Die restlichen Daten (Adresse, Telefon usw) fallen weg, mich interessiert nur Name und Mail-Adresse.

Das Script soll jetzt die Daten Zeile für Zeile auslesen und ALLE Kontaktdaten in eine EINZIGE VCard-Datei schreiben (kann man ja einfach untereinander packen).

Wie löse ich das am besten? Bash? Perl? Python? (PHP?)

LG Linus

LinusNichtTorvalds

(Themenstarter)
Avatar von LinusNichtTorvalds

Anmeldungsdatum:
7. August 2008

Beiträge: 1626

Wohnort: /dev/hardcore

Gut, habe mich jetzt für Bash entschieden, geht denke ich am schnellsten.

Grundgerüst sähe dann so aus:

#! /bin/bash
# usage: vcard-converter.sh sourcefile output.vcard
##################################################################
lines=`wc -l < $1`;
echo "Start converting $lines entries in $1 to $2";
touch $2; #create output-file
## grab each line in source-file and put it into the vcard-format
##
##
echo "Succesfully converted $lines entries. Exit.";

Das Problem liegt darin, dass ich nicht genau weiß, wie ich Zeile für Zeile auslese und in die Datei packe. Ich werde erstmal selber weiter basteln und alle Änderungen hier posten.

LG Linus

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Linus,

Deine Fragestellung sieht für mich nach einem typischen Fall für awk aus, denn das ist für die zeilenweise Verarbeitung von Daten gemacht.

(Disclaimer: natürlich kann man es auch mit jeder anderen Programm-Umgebung machen, aber für mich ist awk am einfachsten, und die Befehle sind einigermaßen gut als "Prosa" lesbar)

Du kannst alle Einstellungen so lassen, denn da ist awk recht flexibel.

Die Aufgabe lautet jetzt also: zerlege jede Zeile in Datenfelder, und drucke dann der Reihe nach alle Zeilen so, wie sie eine VCard haben möchte:

#! /usr/bin/awk -f

BEGIN { FS = ";" }				# Trennzeichen einstellen

## Zeilenaufbau:	[Vorname1;Nachname1;mail1@anbieter1.de]
##			    $1        $2        $3

   {	print "BEGIN:VCARD";
	print "VERSION:3.0";
	print "N:" $2 ";" $1;
	print "FN:" $1 " " $2;
	print "EMAIL;TYPE=INTERNET:" $3;
	print "END:VCARD"
	}

Dieses Skript musst Du natürlich zuerst "ausführbar" machen, und dann als ./vcard_skript adressen.txt > vcard.txt starten.
Das ist alles. Es ist leicht anzupassen, und weitgehend selbsterklärend. (mehr verrät Dir z.B. http://www-e.uni-magdeburg.de/urzs/awk/ )

LG,

track

LinusNichtTorvalds

(Themenstarter)
Avatar von LinusNichtTorvalds

Anmeldungsdatum:
7. August 2008

Beiträge: 1626

Wohnort: /dev/hardcore

Wie jetzt? So einfach ist das? Klappt wunderbar. Wow. Dann muss ich mich mal intensiver mit awk beschäftigen! 😉

Ganz herzlichen Dank!!! ☺

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

LinusNichtTorvalds schrieb:

Wie jetzt? So einfach ist das? Klappt wunderbar. Wow. Dann muss ich mich mal intensiver mit awk beschäftigen! 😉

Davon würde ich abraten. awk ist im Grunde obsolet. Es ist bedeutend weniger mächtig als vollwertige Programmiersprachen wie z. B. Ruby, aber nicht wesentlich einfacher. Im Endeffekt hast Du mehr davon, awk sein zu lassen und z. B. Ruby zu lernen. #!/usr/bin/env ruby

//edit: mal als Beispiel in Ruby:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ARGF.each do |x|
  x = x.chomp.split(/;/)
  print %(BEGIN:VCARD
VERSION:3.0
N: #{x[1]};#{x[0]}
FN: #{x[0]} #{x[1]}
EMAIL; TYPE=INTERNET: #{x[2]}
END:VCARD
)
end

Es ist also kaum schwerer als awk, aber um ein vielfaches mächtiger.

LinusNichtTorvalds

(Themenstarter)
Avatar von LinusNichtTorvalds

Anmeldungsdatum:
7. August 2008

Beiträge: 1626

Wohnort: /dev/hardcore

Mit Ruby hab ich mich noch nie wirklich beschäftigt (im Gegensatz zu z. B. Python)... Aber ich denke, vom Aufwand her besteht zwischen awk, Python, Perl und Ruby kaum ein Unterschied. Mit awk erreiche ich ja genau das, was ich erreichen will.

Aber trotzdem danke für dein Script, vielleicht wird meine Aufgabe ja irgendwann noch komplexer und awk bringt micht nicht weiter 😉

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wenn Du mit Python sowieso fit bist, dann kannst Du meinen Algotithmus doch dorthin umsetzen und brauchst weiter kein awk zu lernen.
Das entscheidende ist sowieso erstmal der Algorithmus.

Es stimmt schon, awk ist uralt, genau so wie die bash, und hat ein paar Eigenheiten ...

Für "schnell mal was machen" nehme ich es gerne, weil es vielseitig genug ist, und die Befehle ziemlich "Prosa" sind, und damit selbst-erklärend.
(und, ich bin mit Python nicht fit 😉 )

LG,

track

Antworten |