#!/usr/bin/perl # export .vcf # remove NULLs! # $0 export.vcf > import.csv use strict; use warnings; my $CRLF = "\015\012"; local $/ = "END:VCARD$CRLF"; while (<>) { my @full; my $keep; my($name) = /${CRLF}N:(.+?)$CRLF/; my @name = split /;/, $name || ''; if (!@name) { my($name) = /${CRLF}FN:(.+?)$CRLF/; @name = $1; push @full, $name, ""; } else { push @full, @name[0, 1]; } my %phone; while (/^TEL;type=(\w+)(;type=pref)?:(.+)$/mg) { $phone{$1} ||= $3; $keep++; } for (qw(HOME WORK CELL PAGER FAX)) { push @full, $phone{$_} || ''; } m/${CRLF}ADR;type=(\w+)(;type=pref)?:(.+?)$CRLF/; my @addr = split /;/, $3 || ''; my $addr = join ' ', map { $_ ||= '' } @addr[0..$#addr]; $addr =~ s/^\s+//; $addr =~ s/\s+$//; $addr =~ s/\\n/, /g; push @full, $addr || '', ''; my @email; while (/^EMAIL;type=(\w+)(;type=pref)?:(.+)$/mg) { push @email, $3; $keep++; } push @full, $email[0] || ''; push @full, $email[1] || ''; my @url; while (/^URL;type=(\w+)(;type=pref)?:(.+)$/mg) { push @url, $3; } push @full, $url[0] || ''; push @full, $url[1] || ''; my($note) = /${CRLF}NOTE:(.+?)$CRLF/; $note ||= ''; $note =~ s/\\n/ /; push @full, $note || ''; for (@full) { s/\s+$//; s/\\,/,/g; } next unless $keep; printf qq'"%s"$CRLF', join '","', @full; } __END__