Introduction
http://www.google.com/contacts?pli=1 Google Contacts's import function will import vcf files containing vCards from Kontact but has the following problems
Solution
A solution is to use the Python vobject library to parse the file and make the following changes
Procedure
http://www.google.com/contacts?pli=1 Google Contacts's import function will import vcf files containing vCards from Kontact but has the following problems
- Kontact sort-string gets turned into phonetic name
- Birthday gets loaded in to the notes section rather than Birthday
- x-kaddressbook-x-anniversary is not loaded
- x-kaddressbook-x-spousesname is not loaded
Solution
A solution is to use the Python vobject library to parse the file and make the following changes
- Firstly - get rid of the custom Kontact fields as vobject cannot handle them
- Google Contacts cannot load the birthday with a timezone component e.g. BDAY:1973-12-12T00:00:00Z - so remove T00:00:00Z by only including the first 10 digits
- When we find x-kaddressbook-x-anniversary make an entry ITEM<n>.X-ABDATE with a label "_$!<Anniversary>!$_"
- When we find x-kaddressbook-x-spousesname make an entry ITEM<n>.X-ABRELATEDNAMES with a label "_$!<Partner>!$_"
- When we see sort-string - just remove it
Procedure
- Pre-process the vcf file by removing custom Kontact fields with awk
Code:
awk '{if ($0 !~ /X-KADDRESSBOOK-[^X]/) {print $0}}' starting_file.vcf > intermediate.vcf
- I Had fields like: X-KADDRESSBOOK-birth_weight, X-KADDRESSBOOK-nee. You can see what you are going to remove with:
Code:
grep -e X-KADDRESSBOOK-[^X] starting_file.vcf
- Create the following python script file and make it executable
Code:
#!/usr/bin/python import vobject, re, sys def printSortCard(cardLines): # Labels have to come before the value for card in cardLines: if re.search("^ITEM.\.X-ABLABEL:_\$!<Partner>!\$_", card): rememberLabel = card else: print card if re.search("ITEM.\.X-ABRELATEDNAMES", card): print rememberLabel fileName = open(sys.argv[1]) cards = vobject.readComponents(fileName) for card in cards: if 'bday' in card.contents: card.bday.value = card.bday.value[:10] if 'x-kaddressbook-x-anniversary' in card.contents: card.add('ITEM1.X-ABDATE').value = card.x_kaddressbook_x_anniversary.value card.add('ITEM1.X-ABLABEL').value = "_$!<Anniversary>!$_" if 'x-kaddressbook-x-spousesname' in card.contents: card.add('ITEM2.X-ABRELATEDNAMES').value = card.x_kaddressbook_x_spousesname.value card.add('ITEM2.X-ABLABEL').value = "_$!<Partner>!$_" if 'sort-string' in card.contents: # Remove sort-string - phonetic name del card.contents[u'sort-string'] printSortCard(card.serialize(validate=False).splitlines() ) fileName.close()
- If convert_google_vcf.py is in the current directory run
Code:
./convert_google_vcf.py intermediate.vcf > google_import.vcf
- Import the file google_import.vcf
Comment