携帯電話に登録されている住所録を、iPhoneに移動させるにはどうしたらよいでしょうか?
私は、携帯電話に登録されている住所録をOutlookに登録することで対応しました。以下はその手順です。
連絡先を管理する色々なソフトウェアがありますが、連絡先はvCard形式と呼ばれる標準フォーマットで保存されることが多いです。
Wikipediaによると「vCardは電子名刺の標準規格フォーマット。項目として名前、住所、電話番号、URL、企業ロゴのほか、写真や音声などを含むことも出来る。」と説明されています。Wikipediaにサンプルがありましたので、以下に掲載しておきます。
上記の例で分かるとおり、vCard形式のデータは「BEGIN:VCARD」で始まり、「END:VCARD」で終わるデータです。
BEGIN:VCARD VERSION:2.1 N:Gump;Forrest FN:Forrest Gump ORG:Gump Shrimp Co. TITLE:Shrimp Man TEL;WORK;VOICE:(111) 555-1212 TEL;HOME;VOICE:(404) 555-1212 ADR;WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America LABEL;WORK;ENCODING=QUOTED-PRINTABLE:100 Waters Edge=0D=0ABaytown, LA 30314=0D=0AUnited States of America ADR;HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America LABEL;HOME;ENCODING=QUOTED-PRINTABLE:42 Plantation St.=0D=0ABaytown, LA 30314=0D=0AUnited States of America EMAIL;PREF;INTERNET:forrestgump@walladalla.com REV:20080424T195243Z END:VCARD
Outlookでは1つのファイルに1個の連絡先が格納されている形式のファイルを扱います。一方携帯電話などのバックアップに使われる形式としては、1つのファイルに複数の連絡先が格納されています。そのため携帯電話のバックアップのデータをOutlookに登録するときは、1つのファイルに1個の連絡先が書かれている形式に変換してあげないといけません。
先ほど述べたように、vCard形式のデータは「BEGIN:VCARD」で始まり、「END:VCARD」で終わるデータです。ですので、この区切り文字を使って、複数ファイルに切り出してあげれば良いです。上記のプログラムをsplitという名前で保存したとしたとき、使い方は以下のとおりです
#!/usr/bin/perl $i = 1; while ( <> ) { $line = $_; if ( $line =‾ m/BEGIN:VCARD/ ) { open OUT, ">vcard" . $i . ".vcf"; $i = $i + 1; print OUT $line; } elsif ( $line =‾ m/END:VCARD/ ) { print OUT $line; close OUT; } else { print OUT $line; } }./split [vcardファイル名]コマンドを実行すると「vcard???.vcf」という名前のファイルが、登録されている連絡先の数だけ作成されます。
先に示したプログラムはソフトウェア工学的に良くないです。入力データの形式とプログラムの形式が一致していないと、保守性の高いプログラムにはなりません。
今回の入力データは、「BEGIN:VCARD 〜 END:VCARD」というデータが複数回現れます。そのため、「BEGIN:VCARD 〜 END:VCARD」を扱うループを内側のループとし、この内側のループが複数回処理するための外側のループとで、2重ループになっていないといけません。
#!/usr/bin/perl $i = 1; # ファイル名に使う番号 while ( <> ) { $line = $_; if ( $line =‾ m/BEGIN:VCARD/ ) { open OUT, ">vcard" . $i . ".vcf"; $i = $i + 1; print OUT $line; while ( <> ) { $line = _; print OUT $line; if ( $line =‾ m/END:VCARD/ ) { last; } } close OUT; } }使い方は、先ほどとのプログラムと同じです。
Outlookに登録するのは簡単です。今回のプログラムを使って作られたファイルをまとめて範囲指定して、outlookにドラック&ドロップします。
すると、登録用のサブウィンドウが連絡先の数だけ開きます。
後は登録ボタン(OKボタン)を押せばよいのですが、これはエンターキーを押し続けることで、順番に全ての連絡先が登録され、ウィンドウも閉じられます。
何故正しくないプログラムを書いてしまうのか?1個目のプログラムは2個の状態を持っています。2個の状態とは、「ファイルが開かれている状態」と「ファイルが閉じている状態」です。状態を表すために、フラグ変数などを使ったりしますが、今回はそのような変数は使っていません。入力データが正しい状況しか考慮していないので、状態変数を必要としていないだけで、本来ならばファイルが閉じているか開いているかを示す状態が必要になるでしょう。
入力データを処理している箇所(処理している内容)が、プログラムの構造に反映されず、状態(変数の値など)に反映されていると、プログラムは非常に読みにくくなってしまいます。また、変更に弱いプログラムになってしまいます。
多くの人がこのようなソフトウェア工学的に正しくないプログラムを書いてしまいます。何故人はこのようなプログラムを書いてしまうのかは非常に興味深いです。人々が失敗する理由も考えておきたいと思っています。