13 December 2016

(Perl) vCardファイルを読む

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