<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://maemo.octonezd.me/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=128.97.245.52</id>
	<title>Maemo Wiki Mirror - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://maemo.octonezd.me/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=128.97.245.52"/>
	<link rel="alternate" type="text/html" href="https://maemo.octonezd.me/index.php/Special:Contributions/128.97.245.52"/>
	<updated>2026-04-22T13:17:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://maemo.octonezd.me/index.php?title=Importing_Windows_Mobile_contacts&amp;diff=13284</id>
		<title>Importing Windows Mobile contacts</title>
		<link rel="alternate" type="text/html" href="https://maemo.octonezd.me/index.php?title=Importing_Windows_Mobile_contacts&amp;diff=13284"/>
		<updated>2010-02-05T03:04:05Z</updated>

		<summary type="html">&lt;p&gt;128.97.245.52: /* pimbackup2vcf.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Import how to ==&lt;br /&gt;
&lt;br /&gt;
To import data, we need a backup file created by the approach mentioned in [[Importing data]], the script mentioned in the end of this page and a N900 (or another Maemo5 device). Powerusers don&#039;t need to follow this precisely, others do:&lt;br /&gt;
&lt;br /&gt;
# connect N900 to PC using mass storage mode; from PC, create a directory &amp;quot;datatransfer&amp;quot; on the &amp;quot;flash disk device&amp;quot; - and copy the script (pimbackup2vcf.py) and backup file (e.g. PIMBackup_20091220.pib) to the directory. Unmount and disconnect.&lt;br /&gt;
# on N900, run xterm&lt;br /&gt;
# &amp;lt;pre&amp;gt;cd /home/user/MyDocs/datatransfer; python pimbackup2vcf.py PIMBackup_20091220.pib contacts.vcf&amp;lt;/pre&amp;gt;&lt;br /&gt;
# start addressbook app, from the menu choose &#039;&#039;Get contacts&#039;&#039; and &#039;&#039;Import contacts file&#039;&#039; in the following popup. Choose the contacts.vcf file in datatransfer directory.&lt;br /&gt;
# You should have the contacts imported. :)&lt;br /&gt;
&lt;br /&gt;
== pimbackup2vcf.py ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python2.5&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import zipfile&lt;br /&gt;
import csv&lt;br /&gt;
import sys,os&lt;br /&gt;
import codecs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):&lt;br /&gt;
	# csv.py doesn&#039;t do Unicode; encode temporarily as UTF-8:&lt;br /&gt;
	csv_reader = csv.reader(utf_8_encoder(unicode_csv_data), dialect=dialect, **kwargs)&lt;br /&gt;
	for row in csv_reader:&lt;br /&gt;
		# decode UTF-8 back to Unicode, cell by cell:&lt;br /&gt;
		yield [unicode(cell, &#039;utf-8&#039;) for cell in row]&lt;br /&gt;
&lt;br /&gt;
def utf_8_encoder(unicode_csv_data):&lt;br /&gt;
	for line in unicode_csv_data:&lt;br /&gt;
		yield line.encode(&#039;utf-8&#039;)&lt;br /&gt;
	unicode_csv_data.close()&lt;br /&gt;
&lt;br /&gt;
def csvf(row, f):&lt;br /&gt;
	try:&lt;br /&gt;
		i=csv_fields.index(f)&lt;br /&gt;
	except:&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	return row[i]&lt;br /&gt;
&lt;br /&gt;
def convdate(d):&lt;br /&gt;
	if len(d)&amp;lt;8:&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	return d[0]+d[1]+d[2]+d[3]+&#039;-&#039;+d[4]+d[5]+&#039;-&#039;+d[6]+d[7]&lt;br /&gt;
&lt;br /&gt;
def addne(s, pre, post):&lt;br /&gt;
	if post==&amp;quot;&amp;quot;:&lt;br /&gt;
		return s;&lt;br /&gt;
	else:&lt;br /&gt;
		return s+pre+post+&#039;\n&#039;;&lt;br /&gt;
&lt;br /&gt;
def csvline2vcf(row):&lt;br /&gt;
	rv=&amp;quot;&amp;quot;&lt;br /&gt;
	rv+=&amp;quot;BEGIN:VCARD&amp;quot;+&#039;\n&#039;&lt;br /&gt;
	rv+=&amp;quot;VERSION:3.0&amp;quot;+&#039;\n&#039;&lt;br /&gt;
	rv=addne(rv, &amp;quot;N:&amp;quot;, csvf(row, &amp;quot;Name&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;FN:&amp;quot;, csvf(row, &amp;quot;First Name&amp;quot;)+&amp;quot; &amp;quot;+csvf(row, &amp;quot;Last Name&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;NICKNAME:&amp;quot;, csvf(row, &amp;quot;NickName&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=CELL,VOICE:&amp;quot;, csvf(row, &amp;quot;Mobile Phone&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=WORK,VOICE:&amp;quot;, csvf(row, &amp;quot;Business Phone&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=WORK,VOICE:&amp;quot;, csvf(row, &amp;quot;Business Phone 2&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=HOME,VOICE:&amp;quot;, csvf(row, &amp;quot;Home Phone&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=HOME,VOICE:&amp;quot;, csvf(row, &amp;quot;Home Phone 2&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;EMAIL;TYPE=PREF,INTERNET:&amp;quot;, csvf(row, &amp;quot;E-mail Address&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;TEL;TYPE=WORK,VOICE:&amp;quot;, csvf(row, &amp;quot;Work Phone&amp;quot;))&lt;br /&gt;
	rv=addne(rv, &amp;quot;URL:&amp;quot;, csvf(row, &amp;quot;Web Page&amp;quot;))&lt;br /&gt;
	if csvf(row, &amp;quot;Home City&amp;quot;)!=&amp;quot;&amp;quot;:&lt;br /&gt;
		rv=addne(rv, &amp;quot;ADR:;;&amp;quot;, csvf(row, &amp;quot;Home Street&amp;quot;)+&#039;;&#039;+csvf(row, &amp;quot;Home City&amp;quot;)+&#039;;&#039;+csvf(row, &amp;quot;Home State&amp;quot;)+&#039;;&#039;+csvf(row, &amp;quot;Home Postal Code&amp;quot;)+&#039;;&#039;+csvf(row, &amp;quot;Home Country&amp;quot;))&lt;br /&gt;
	&lt;br /&gt;
	rv=addne(rv, &amp;quot;BDAY:&amp;quot;, convdate(csvf(row, &amp;quot;Birthday&amp;quot;)))&lt;br /&gt;
	rv=addne(rv, &amp;quot;X-ANNIVERSARY:&amp;quot;, convdate(csvf(row, &amp;quot;Anniversary&amp;quot;)))&lt;br /&gt;
	rv+=&amp;quot;END:VCARD&amp;quot;+&#039;\n&#039;+&#039;\n&#039;&lt;br /&gt;
	&lt;br /&gt;
	return rv&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TMPFILENAME=&amp;quot;/tmp/contacts.csc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if len(sys.argv)&amp;lt;3:&lt;br /&gt;
	print sys.argv[0], &amp;quot; PIMbackupfile.pib output.vcf&amp;quot;&lt;br /&gt;
	sys.exit()&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Processing&amp;quot;, sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
zf=zipfile.ZipFile(sys.argv[1])&lt;br /&gt;
&lt;br /&gt;
contactsFN=[fn for fn in zf.namelist() if &#039;contacts&#039; in fn][0]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tmpfile=open(TMPFILENAME, &#039;w&#039;)&lt;br /&gt;
&lt;br /&gt;
tmpfile.write(zf.read(contactsFN))&lt;br /&gt;
&lt;br /&gt;
tmpfile.close()&lt;br /&gt;
&lt;br /&gt;
cf=unicode_csv_reader(codecs.open(TMPFILENAME, &#039;r&#039;, &amp;quot;utf-16&amp;quot;), delimiter=&#039;;&#039;, quotechar=&#039;&amp;quot;&#039;)&lt;br /&gt;
&lt;br /&gt;
vcf=codecs.open(sys.argv[2], &#039;w&#039;, &amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
lineNo=0&lt;br /&gt;
&lt;br /&gt;
for row in cf:&lt;br /&gt;
	if lineNo==0:&lt;br /&gt;
		csv_fields=row&lt;br /&gt;
		lineNo+=1&lt;br /&gt;
	else:&lt;br /&gt;
		vcf.write(csvline2vcf(row))&lt;br /&gt;
&lt;br /&gt;
vcf.close()&lt;br /&gt;
&lt;br /&gt;
os.remove(TMPFILENAME)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending the script ==&lt;br /&gt;
&lt;br /&gt;
The script would, with little modifications, import contacts data from generally any csv file. The csv file has to contain initial line with columns&#039; titles. Data contained in the output VCF file is defined in the &#039;&#039;&#039;csvline2vcf(row)&#039;&#039;&#039; function - which converts a csv line to a vcf record string.&lt;br /&gt;
&lt;br /&gt;
[[Category:Power users]]&lt;/div&gt;</summary>
		<author><name>128.97.245.52</name></author>
	</entry>
</feed>