小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

auのアドレス帳をMacのAddressBook形式に変換するスクリプト

iPhone買ったよ!
W-ZERO3やad-esを使ってきた経験からスマートフォンをメイン機に使えるとは考えておらず、普通に2本目として新規契約したんだけど、今になってMNPで番号ごと変えてしまえばよかったかなーとか思ってます。まだあんまり使ってないけど!


で、今まで使っていたauのアドレス帳のデータをMacに吸い上げようと、データをvcfでmicroSDにバックアップして、Macのアドレスブックにインポートしたんだけど、色々と問題があった。

  1. ふりがなが無視される
  2. グループ情報が無視される
  3. [名字] [名前]とスペースで分割してあっても、まとめて名字になる
  4. 無視された情報がメモ欄に入って汚い

これはかなり問題がある。手動でふりがなやグループをつけてもいいのだけど、非コミュ傾向のある俺ですら155人のアドレス帳が入っている。相当面倒くさい作業だ。ちなみに、au携帯のアドレス帳をMacのアドレス帳に移行する。 | ゼロ・デザイニング [0-designing]で紹介されているau oneお預かりサービスを利用する方法も試してみたけど、こちらでもやはりグループ情報が無視された。


で、調べてみたところ、Apple アドレスブックは「ファイルインポート時に必ずグループ情報を無視する」らしい。これではグループ情報をインポートすることは不可能だ。


だけど、ファイルをグループにドラッグアンドドロップすることで、任意のvcfファイルを既存のグループに一括追加することは出来る。
ということは、vcfファイルを、カードのカテゴリ情報ごとに分割する事ができれば、あとは少しの手間でグループ分類つきインポートができる。

というわけで、分割するスクリプトを書いた

機能
  1. auの携帯電話の出力するAD_xxxx.VCFファイルを、グループごとのファイルに分割する。
  2. ふりがなをアドレスブックが読めるようにする
  3. ふりがな/氏名は、半角スペースで区切ってある場合姓・名に分ける。
  4. メモ欄にゴミがつかない
使い方
  1. auの携帯電話からアドレス帳のバックアップデータをPCに持ってくる(やり方は各自ググってください。au oneの吐くCVSじゃなく、バックアップで取れるVCFです。)
  2. 下のパールスクリプトをローカル(バックアップデータと同じ場所)に(au2ab.pl名で)保存し、以下のように実行する。
    1. perl au2ab.pl ./AD_0000.VCF(←アドレスデータ)
  3. グループごとのファイル([グループ名].vcf)が生成されます
  4. アドレスブックで任意のグループを作成し、グループ名.vcfをそこにドラッグアンドドロップする。

以上。

ソース
#!/usr/bin/perl
use utf8;
use Encode;
binmode(STDOUT, ":utf8");

my $path= shift;

my @lines;
my $line;
my $buffer;
my %category;
my $cat;
open (FILE,'<:encoding(shiftjis)',$path);

@lines = <FILE>;

close(FILE);

foreach $line(@lines){
        if( $line =~ /^SORT\-STRING:([^\x20]+)\x20([^\x20]+)$/ ){
                $line = "X-PHONETIC-LAST-NAME:$1\nX-PHONETIC-FIRST-NAME:$2\n";
        }
        if( $line =~ /^N:([^\s]+)\s([^\s;]+);;;;/ ){
                $line = "N:$1;$2;;;\n";
        }
        $line =~ s/^SORT\-STRING/X\-PHONETIC\-LAST\-NAME/;
        $line =~ s/^X\-GNO.*//;
        $line =~ s/^X\-REDUCTION.*//;
        $line =~ s/^CLASS.*//;

        if( $line =~ /^X-GN:(.*)/){
                $cat = $1;
        }
        $buffer .=$line;

        if( $line =~ /^END:VCARD/){
                $category{$cat}.=$buffer;
                $buffer='';
        }
}

foreach $cat (keys %category){
        open (FILE, '>:encoding(utf8)',$cat.'.vcf');
        print FILE $category{$cat};
        close(FILE);
}

わーいiPhoneに無事アドレス帳をインポートできたよー^o^!

注意

多分標準的なMac環境なら動作すると思いますが、PerlUNIXの基礎的な知識のある人以外にはお薦めしません。
一応手元の環境(Leopard, Infobar2)で動作確認はしてるけど、使用は自己責任でお願いします。