PerlのCPANにvCardライブラリを用いて、VCardファイルを読み込むサンプルスクリプト
VCardファイルの形式例
GoogleのGmail連絡先からエクスポートしたvCardファイル例(Version 3.0形式)
BEGIN:VCARD VERSION:3.0 FN:テスト姓テスト名 N:テスト姓;テスト名;;; EMAIL;TYPE=INTERNET;TYPE=HOME:test@home.example.com EMAIL;TYPE=INTERNET;TYPE=WORK:test@work.example.com item1.EMAIL;TYPE=INTERNET:test@custom.example.com item1.X-ABLabel:カスタム TEL;TYPE=HOME:03-1234-5678 TEL;TYPE=CELL:090-1234-5678 TEL;TYPE=WORK:06-1234-5678 TEL;TYPE=HOME;TYPE=FAX:075-123-4567 ADR;TYPE=HOME:私書箱××;△△地区;○○町1−2−3△△マンション1234;三鷹市;東京都;123-4567;日本 ADR;TYPE=WORK:私書箱××;△△地区;○○町9−8−7;神戸市○○区;兵庫県;678-1234;日本 BDAY:1980-05-25 item2.URL:http\://www.example.com/ item2.X-ABLabel:_$!<HomePage>!$_ NOTE:メモ文章 END:VCARD
同一の内容を、Version 2.1形式で書けば
BEGIN:VCARD VERSION:2.1 N:テスト姓;テスト名;;; FN:テスト姓テスト名 EMAIL;INTERNET;HOME:test@home.example.com EMAIL;INTERNET;WORK:test@work.example.com TEL;HOME:03-1234-5678 TEL;CELL:090-1234-5678 TEL;WORK:06-1234-5678 TEL;HOME;FAX:075-123-4567 ADR;HOME:私書箱××;△△地区;○○町1−2−3△△マンション1234;三鷹市;東京都;123-4567;日本 ADR;WORK:私書箱××;△△地区;○○町9−8−7;神戸市○○区;兵庫県;678-1234;日本 BDAY:1980-05-25 URL:http\://www.example.com/ NOTE:メモ文章 END:VCARD
VCard読み込みスクリプト
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use vCard;
#use vCard::AddressBooks;
use Data::Dumper;
binmode(STDOUT, ":utf8");
my $address_book = vCard::AddressBook->new();
$address_book->load_file('test.vcf');
my $number_of_data = scalar @{$address_book->vcards()};
print "データ数 : " . $number_of_data . "\n";
print "===============\n";
# 読み込んだデータを、解析用にダンプする
print Dumper $address_book->vcards();
foreach my $vcard (@{ $address_book->vcards() }) {
# 姓,名 (このほかに、Mr とか Dr などの属性もあるが、日本では余り使わないので読み出さない)
if(defined($vcard->family_names()->[0])){ print $vcard->family_names()->[0] . " "; }
if(defined($vcard->given_names()->[0])){ print $vcard->given_names()->[0] . " "; }
print "\n";
# 表示名
if(defined($vcard->full_name())){ print $vcard->full_name() . " "; }
print "\n";
# 電子メール
foreach my $email ( @{$vcard->email_addresses} ){
if(defined($email->{type}->[0])){ print $email->{type}->[0] . " "; }
if(defined($email->{address})){ print $email->{address} . " "; }
print "\n";
}
# 電話番号
foreach my $phone ( @{$vcard->phones} ){
if(defined($phone->{type}[0])) {
print $phone->{type}[0] . " ";
}
print $phone->{number} . "\n";
}
# 住所
foreach my $address ( @{$vcard->addresses} ){
if(defined($address->{type}->[0])){ print $address->{type}->[0] . " "; }
if(defined($address->{post_code})){ print $address->{post_code}; }
if(defined($address->{country})){ print $address->{country}; }
if(defined($address->{region})){ print $address->{region}; }
if(defined($address->{city})){ print $address->{city}; }
if(defined($address->{street})){ print $address->{street}; }
if(defined($address->{po_box})){ print $address->{po_box}; }
print "\n";
}
# 誕生日(1970-01-01 形式もしくは19700101)
if(defined($vcard->birthday())) { print "birth " . $vcard->birthday() . "\n"; }
print "===============\n";
}
vCardライブラリでの不都合な点
・vCardファイルの行末記号はCR+LFのみ
・NOTEが読み出せない。