I order to migrate contacts from a Sony Ericsson C510 to a HTC Desire you first have to export them in an usable format. Wammu recognizes this phone and exports a .vcf file containing all contacts. However there are some major limitations to this process:

  • entries which contains multiple phone numbers are exported separately instead of a single vcf. For an entry named “me” containing a mobile and work phone the exported file contains a: me/M and me/W contact
BEGIN:VCARD
VERSION:2.1
X-GAMMU-LOCATION:1
X-GAMMU-MEMORY:ME
TEL;PREF:012345
N:me/M
END:VCARD

BEGIN:VCARD
VERSION:2.1
X-GAMMU-LOCATION:2
X-GAMMU-MEMORY:ME
TEL;PREF:0123456
N:me/W
END:VCARD
  • entries from the sim card and phone memory are duplicated but in the ones from the sim card the names are truncated even if the phones are identical
BEGIN:VCARD
VERSION:2.1
X-GAMMU-LOCATION:12
X-GAMMU-MEMORY:ME
TEL;PREF:0031234567
N:Antonio Potter/W
END:VCARD

BEGIN:VCARD
VERSION:2.1
X-GAMMU-LOCATION:9
X-GAMMU-MEMORY:SM
TEL;PREF:0031234567
N:Antonio Po/W
END:VCARD

This script I wrote in a hurry to address these issues and unify contacts. It uses the vobject library installable on ubuntu from the python-vobject package. It’s only a 15 minutes work so bear with its deficiencies or extend it otherwise.

<pre lang="python">
#!/usr/bin/env python
# Copyright (C) 2010 Marilen Corciovei
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os, sys, vobject

cards = {}
names = []

def clean(fileName):
    vFile = open(fileName, 'r')
    line = vFile.readline()
    vCardData = ''
    while line:
        vCardData += line
        if line.startswith('END'):
            parseVCard(vCardData)
            vCardData = ''
        line = vFile.readline()
    
    cnt = 0
    for k, v in cards.items():
        newcard(k, v)
        cnt += 1
    #print 'Cleaned: %s' % cnt

def parseVCard(vCard):        
    card = vobject.readOne(vCard)
    name = str(card.n.value).strip()
    tel = str(card.tel.value).strip()
    type = None
    if name.endswith('/M'):
        name = name[:-2]
        type = 'CELL'
    if name.endswith('/W'):
        name = name[:-2]
        type = 'WORK'
    if name.endswith('/H'):
        name = name[:-2]
        type = 'HOME'
    if name.endswith('/O'):
        name = name[:-2]
        type = 'OFFICE'
        
    duplicated = False
    #based on the fact that simm entries are at the end
    for n in names:
        if len(n) != len(name) and n.find(name) == 0:
            #print 'duplicated %s, %s' %(n, name)
            for i in cards[n]:
                if i[1] == tel:
                    duplicated = True
                    #print 'Duplicated phone'
    if name not in names:
        names.append(name)
           
    if not duplicated: 
        if cards.has_key(name):
            cards[name].append([type, tel])
        else:
            cards[name] = [[type, tel]]
        
    #card.prettyPrint()

def newcard(name, tels):
    namesplit = name.split(' ')
    ts = []
    newcard = """BEGIN:VCARD
VERSION:2.1
"""
    n = namesplit[-1] + ';' + ' '.join(namesplit[0:-1]) + ';;;'
    newcard += "N:%s\n" % n        
    newcard += "FN:%s\n" % name
    for tel in tels:
        if tel[1] not in ts:
            newcard += "TEL"
            if tel[0]:
                newcard += ";" + tel[0]
            newcard += ";PREF:" + tel[1] + "\n" 
            ts.append(tel[1])
    newcard += "END:VCARD\n"
    print newcard
    
if __name__=='__main__':
    clean(sys.argv[1])

Once the .vcf file has been cleaned and unified you will end-up with a file which you can copy on the sdcard of the HTC and import it.