Konvertiere eine CSV-Datei in das vCard-Format
Kürzlich stand ich vor dem Problem, eine CSV-Datei in vCard-Einträge konvertieren zu müssen. Bei 10 oder 20 Einträgen macht man das evtl. noch manuell, aber ich hatte über 200 Einträge zu übertragen. Spätestens ab diesem Volumen lohnt es sich über ein passendes Skript nachzudenken, das diese Aufgabe verlässlich ausführt. Für alle, die sich dieser Aufgabe ebenfalls stellen müssen (und evtl. noch eine Einträge mehr zu übertragen haben), stelle ich das Skript hier zur Verfügung:
#!/bin/bash
# Script:
# Version: 1.0
# Autor: Marco Morath
# Lizenz: Gnu GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>
# Anwenderhinweis:
# Das Skript erzeugt aus jeder Zeile einer CSV-Datei einen vcard-Eintrag in einer vcard-Datei.
# Somit kann aus einer CSV-Datei mit Kontakten eine importierbare vcard-Datei erzeugt werden.
# Nach dem Dateinamen ist (ggf. mit relativem Pfad) die CSV-Datei anzugeben.
# Als Ausgabe wird die Datei contacts.vcf erzeugt.
# Überprüfen, ob die Eingabedatei angegeben wurde
if [ "$#" -ne 1 ]; then
echo "Verwendung: $0 <input.csv>"
exit 1
fi
# Eingabedatei
INPUT_FILE=$1
# Ausgabedatei
OUTPUT_FILE="contacts.vcf"
# Leere die Ausgabedatei, falls sie existiert
> $OUTPUT_FILE
# Überspringe die Kopfzeile und lese die CSV-Zeilen
# +2 = Kopfzeile überspringen
# Es müssen alle CSV-Felder in der Reihenfolge der CSV-Datei eingegeben werden (ob diese genutzt werden oder nicht)
# Weitere Informationen zu den Feldbezeichnungen: https://de.wikipedia.org/wiki/VCard#Spezifikation
tail -n +2 $INPUT_FILE | while IFS=';' read -r Typ Vorname Nachname Firma Position Hinweis Schlagworte Telefon_privat Telefon_arbeit Telefon_mobil Fax Telefon_sonstige EMail_privat EMail_arbeit EMail_sonstige Strasse Ort Bundesland PLZ Land
do
cat >> $OUTPUT_FILE <<EOL
BEGIN:VCARD
VERSION:3.0
FN;CHARSET=UTF-8:$Vorname $Nachname
N;CHARSET=UTF-8:$Nachname;$Vorname;;;
KIND;CHARSET=UTF-8:$Typ
TEL;type=HOME;VOICE:$Telefon_privat
TEL;type=WORK;VOICE:$Telefon_arbeit
TEL;type=HOME;CELL:$Telefon_mobil
TEL;type=OTHER;VOICE:$Telefon_sonstige
TEL;type=HOME;FAX:$Fax
TITLE;CHARSET=UTF-8:$Position
EMAIL;type=HOME:$EMail_privat
EMAIL;type=WORK:$EMail_arbeit
EMAIL;type=OTHER:$EMail_sonstige
CATEGORIES;CHARSET=UTF-8:$Schlagworte
NOTE;CHARSET=UTF-8:$Hinweis
ORG;CHARSET=UTF-8:$Firma
ADR;type=WORK;CHARSET=UTF-8:;;$Strasse;$Ort;$Bundesland;$PLZ;$Land
END:VCARD
EOL
done
echo "VCF-Datei erfolgreich erstellt: $OUTPUT_FILE"
Das vCard-Format ist zwar spezifiziert, jedoch hält sich nicht jede Software daran oder es wird mit einer alten Version gearbeitet. Es kann daher durchaus sein, dass der Import mit der vcf-Datei, die dieses Skript erzeugt, nicht funktioniert. Es wird in diesem Fall empfohlen einen Mustereintrag in der Software zu erzeugen, diesen zu exportieren und anhand des exportierten Eintrags das Skript so anzupassen, dass das Importformat den Anforderungen der Software entspricht.