Skip to content

Instantly share code, notes, and snippets.

@mridah
Created December 23, 2016 11:58
Show Gist options
  • Save mridah/5d8aac6b4150373b1be57dd4e12b7fb0 to your computer and use it in GitHub Desktop.
Save mridah/5d8aac6b4150373b1be57dd4e12b7fb0 to your computer and use it in GitHub Desktop.
csv2vcf is a small command line tool to convert CSV files to VCard (.vcf) files.
"""
Author : Mridul Ahuja
Github : https://github.com/mridah/csv2vcf
Description : A small command line tool to convert CSV files to VCard files
"""
import os
import sys
import csv
import json
def convert_to_vcard(input_file, single_output, input_file_format):
FN = input_file_format['name']-1 if 'name' in input_file_format else None
NICKNAME = input_file_format['nickname']-1 if 'nickname' in input_file_format else None
ORG = input_file_format['org']-1 if 'org' in input_file_format else None
TEL = input_file_format['tel']-1 if 'tel' in input_file_format else None
URL = input_file_format['url']-1 if 'url' in input_file_format else None
BDAY = input_file_format['bday']-1 if 'bday' in input_file_format else None
ROLE = input_file_format['role']-1 if 'role' in input_file_format else None
EMAIL = input_file_format['email']-1 if 'email' in input_file_format else None
# if single output option is selected
if single_output :
with open( input_file, 'r' ) as source_file:
reader = csv.reader( source_file )
single_vcf = open('csv2vcf/all_contacts.vcf', 'w')
i = 0
for row in reader:
FN_VAL = row[FN] if FN is not None else ''
NICKNAME_VAL = row[NICKNAME] if NICKNAME is not None else ''
ORG_VAL = row[ORG] if ORG is not None else ''
TEL_VAL = row[TEL] if TEL is not None else ''
URL_VAL = row[URL] if URL is not None else ''
BDAY_VAL = row[BDAY] if BDAY is not None else ''
ROLE_VAL = row[ROLE] if ROLE is not None else ''
EMAIL_VAL = row[EMAIL] if EMAIL is not None else ''
print 'BEGIN:VCARD'
print 'VERSION:3.0'
print 'N:' + FN_VAL
print 'FN:' + FN_VAL
print 'NICKNAME:' + NICKNAME_VAL
print 'TEL;HOME;VOICE:' + TEL_VAL
print 'EMAIL:' + EMAIL_VAL
print 'BDAY:' + BDAY_VAL
print 'ORG:' + ORG_VAL
print 'ROLE:' + ROLE_VAL
print 'URL:' + URL_VAL
print 'END:VCARD'
print '----------------------'
# write the single file
single_vcf.write( 'BEGIN:VCARD' + "\n")
single_vcf.write( 'VERSION:3.0' + "\n")
single_vcf.write( 'N:' + FN_VAL + ';' + "\n")
single_vcf.write( 'FN:' + FN_VAL + "\n")
single_vcf.write( 'NICKNAME:' + NICKNAME_VAL + "\n")
single_vcf.write( 'TEL;HOME;VOICE:' + TEL_VAL + "\n")
single_vcf.write( 'EMAIL:' + EMAIL_VAL + "\n")
single_vcf.write( 'BDAY:' + BDAY_VAL + "\n")
single_vcf.write( 'ORG:' + ORG_VAL + "\n")
single_vcf.write( 'ROLE:' + ROLE_VAL + "\n")
single_vcf.write( 'URL:' + URL_VAL + "\n")
single_vcf.write( 'END:VCARD' + "\n")
single_vcf.write( "\n")
i += 1
single_vcf.close()
print str(i) + " VCARDS written"
print '----------------------'
# default ( multi-file output )
else :
with open( input_file, 'r' ) as source_file:
reader = csv.reader( source_file )
i = 0
for row in reader:
FN_VAL = row[FN] if FN is not None else ''
NICKNAME_VAL = row[NICKNAME] if NICKNAME is not None else ''
ORG_VAL = row[ORG] if ORG is not None else ''
TEL_VAL = row[TEL] if TEL is not None else ''
URL_VAL = row[URL] if URL is not None else ''
BDAY_VAL = row[BDAY] if BDAY is not None else ''
ROLE_VAL = row[ROLE] if ROLE is not None else ''
EMAIL_VAL = row[EMAIL] if EMAIL is not None else ''
print 'BEGIN:VCARD'
print 'VERSION:3.0'
print 'N:' + FN_VAL
print 'FN:' + FN_VAL
print 'NICKNAME:' + NICKNAME_VAL
print 'TEL;HOME;VOICE:' + TEL_VAL
print 'EMAIL:' + EMAIL_VAL
print 'BDAY:' + BDAY_VAL
print 'ORG:' + ORG_VAL
print 'ROLE:' + ROLE_VAL
print 'URL:' + URL_VAL
print 'END:VCARD'
print '----------------------'
# write each entry
each_vcf = open('csv2vcf/' + FN_VAL + '_' + TEL_VAL + ".vcf", 'w')
each_vcf.write( 'BEGIN:VCARD' + "\n")
each_vcf.write( 'VERSION:3.0' + "\n")
each_vcf.write( 'N:' + FN_VAL + ';' + "\n")
each_vcf.write( 'FN:' + FN_VAL + "\n")
each_vcf.write( 'NICKNAME:' + NICKNAME_VAL + "\n")
each_vcf.write( 'TEL;HOME;VOICE:' + TEL_VAL + "\n")
each_vcf.write( 'EMAIL:' + EMAIL_VAL + "\n")
each_vcf.write( 'BDAY:' + BDAY_VAL + "\n")
each_vcf.write( 'ORG:' + ORG_VAL + "\n")
each_vcf.write( 'ROLE:' + ROLE_VAL + "\n")
each_vcf.write( 'URL:' + URL_VAL + "\n")
each_vcf.write( 'END:VCARD' + "\n")
each_vcf.write("\n")
each_vcf.close()
i += 1
print str(i) + " VCARDS written"
print '----------------------'
def main(args):
args_len = len(args)
if args_len < 3 or args_len > 4 :
print ( "Usage:")
print ( args[0] + " filename")
sys.exit()
if args_len == 3 :
input_file = args[1]
try :
input_file_format = json.loads(args[2])
except Exception as e :
print '\033[91m'+"ERROR : json could not be parsed"+'\033[0m'
sys.exit()
single_output = 0
elif args_len == 4 :
input_file = args[1]
if args[2] == '-s' or args[2] == '--single' :
single_output = 1
else :
print '\033[91m'+"ERROR : invalid argument `" + args[2] + "`"+'\033[0m'
sys.exit()
try :
input_file_format = json.loads(args[3])
except Exception as e :
print '\033[91m'+"ERROR : json could not be parsed"+'\033[0m'
sys.exit()
if not os.path.exists(input_file) :
print '\033[91m'+"ERROR : file `" + input_file + "` not found"+'\033[0m'
sys.exit()
if not os.path.exists('csv2vcf') :
os.makedirs('csv2vcf')
convert_to_vcard(input_file, single_output, input_file_format)
if __name__ == '__main__':
main(sys.argv)
@mridah
Copy link
Author

mridah commented Dec 23, 2016

Usage : python csv2vcf.py CSV_FILE_NAME [ -s | --single ] INPUT_FILE_FORMAT

Where :

CSV_FILE_NAME is the full name of the CSV file you want to convert
INPUT_FILE_FORMAT is a JSON formatted string which tells csv2vcf how to parse your input file
-s or --single : use this argument if you want your output in a single file. Optional parameter. By default, the program will create separate Vcard files for each entry

The JSON string can have the following keys :
name, nickname, org, tel, url, bday, role, and email, where each property is in accordance with vCard property types

Format is {KEY_1:KEY_1_COLUMN_NO, KEY_2:KEY_2_COLUMN_NO, ...}

Example inputs :

  • python csv2vcf.py contacts.csv '{"name":1, "tel":2}'
  • python csv2vcf.py -s contacts.csv '{"name":1, "tel":2}'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment