Importing Contacts into an iPhone in Bulk
So I had a problem; when I left my previous employer, I had been using my iPhone to interface with work email. That worked great. But one problem that I face after I left was that all my contacts were in the Active Directory/Exchange address book system. I asked for, and received, a CSV of my contact info when I left.
Then this sat for a while, for months, while I didn’t do anything about it. I grabbed the occasional contact out of it I needed, but it was a pain in the ass. So what I did to really fix this problem was a bit of hacking. Turns out that the iPhone will import a bulk vCard address book. And it turns out that vCard is a documented standard with easy perl modules for using it. So I did what I often do: I wrote a tool to solve my problem. This tool is pretty simple — it takes a pipe separated “CSV” file, reads it in, and creates a vcard address book, then outputs that to STDOUT.
An example entry from the file would be:
FirstName|LastName|Company|HomePhone|MobilePhone|Email1|Email2
Gabriel|Cain|||(206) 123-4567|gabriel@domain1.com|gabriel@domain2.com
And what follows is the script I wrote to deal with this problem.
#!/usr/bin/perl
use strict;
use Text::vCard;
use Text::vCard::Addressbook;
my @contacts;
open(F,"<$ARGV[0]") or die("Can't open $ARGV[0]: $!\n");
foreach my $row (<F>) {
my $index = 0;
my %c = (); my @p = split /\|/, $row;
# Skip rows that don't have enough columns
next if (scalar @p != 7);
foreach (qw/first last company home mobile email1 email2/) {
$c{$_} = $p[$index]; $index ++;
}
push @contacts, \%c;
}
close(F);
# Create a new address book
my $address_book = Text::vCard::Addressbook->new();
foreach my $r (@contacts) {
my %c = %{$r};
my $vcard = $address_book->add_vcard();
$vcard->fullname( "$c{first} $c{last}" );
$vcard->email( $c{email1} );
my $name = $vcard->add_node({'node_type'=>'N'});
$name->family( $c{last} ); $name->given( $c{first} );
my $mobil = $vcard->add_node({'node_type'=>'TEL'});
$mobil->add_types('cell'); $mobil->value($c{mobile});
$mobil = $vcard->add_node({'node_type'=>'TEL'});
$mobil->add_types('home'); $mobil->value($c{home});
}
print $address_book->export();
So that’s the solution I took to importing my contacts into my iPhone using vCards. I’m pretty happy with it. Just write the output of this script to a file, and email it to your phone. Attached will be a vcard address book that you can import all the contacts from. Pretty spiffy.