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が読み出せない。