#!/usr/bin/perl -w
use strict;

# This is based on Netscape's vcard format
# Usage: vcf2csv files > your.csv

# headers
print 'LNAME,FNAME,FULLNAME,TITLE,ADDR1,ADDR2,ADDR3,' .
      'CITY,PROV,POSTAL,COUNTRY,ORG,DEPT,EMAIL,' .
      'HOME,WORK,CELL,PAGER,FAX,URL,NOTE' . "\n";

my %vcard;
while ( <> ) {
  if ( /^begin:vcard\s*$/i .. /^end:vcard\s*$/i ) {
    if    ( /^n(?:;quoted-printable)?:(.*)$/i ) {
      @vcard{qw/lname fname/} = split /;/, $1;
      }
    elsif ( /^fn(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{fullname} = $1;
      }
    elsif ( /^adr(?:;quoted-printable)?:(.*)$/i ) {
      @vcard{qw/addr1 addr2 addr3 city prov postal country/} = split /;/, $1, 7;
      }
    elsif ( /^tel;pager(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{pager} = $1;
      }
    elsif ( /^tel;cell(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{cell} = $1;
      }
    elsif ( /^tel;fax(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{fax} = $1;
      }
    elsif ( /^tel;home(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{home} = $1;
      }
    elsif ( /^tel;work(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{work} = $1;
      }
    elsif ( /^url(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{url} = $1;
      }
    elsif ( /^org(?:;quoted-printable)?:(.*)$/i ) {
      @vcard{qw/org dept/} = split /;/, $1;
      }
    elsif ( /^email;internet(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{email} = $1;
      }
    elsif ( /^title(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{title} = $1;
      }
    elsif ( /^note(?:;quoted-printable)?:(.*)$/i ) {
      $vcard{note} = $1;
      }
    elsif ( /^end:vcard\s*$/i ) {
      local $" = '","';
      print qq["@vcard{qw/lname fname fullname title addr1 addr2 addr3
                          city prov postal country org dept email
                          home work cell pager fax url note/}"\n];
      %vcard = ();
      }
    }
  }

