スマホのアドレス帳編集

最近交際範囲に変化が有ったことから、携帯電話のアドレス帳を抜本的に編集してみようと思いました。ドコモショップで教えてもらったデータコピーは本体のアドレス帳データをMicroSDカードに転送できるとのことでした。

そこで実際に試してみると、SD_PIM とcom.nttdocomo.android.sdcardbackup というフォルダの下に、どちらもPIM00001.VCFというファイルが作成されていました。拡張子vcfのファイルはvCardといって、結構あちこちのアドレス帳で使用されているファイル形式なのだそうです。後者のファイルを実際に開いてみると、下図のようなテキストファイルが現れました。ちなみにSD_PIM の下のPIM00001.VSFはSiftJIS形式でした。これについては試していません。

  f:id:S_E_Hyphen:20190726152137j:plain

BEGIN:VCARDという行で始まり、END:VCARDという行で終わる一連のデータが一人分のアドレスです。これが延々登録人数分続いているわけです。

テキスト形式ですからエディターで編集できますし、sedawkを使いこなせば特定のフィールドを自動的に加工することも可能です。なお実際には試していませんが、perlにはvCardに特化したライブラリが用意されているそうです。私はperlを使ったことがないので、下記のようなシェルスクリプトを作成してみました。

#!/bin/bash
# 変数nameにはアドレス帳の見出し欄の名前が入る
# 配列変数bodyにはnameに対応するvCardの各行が格納される
infile="PIM00001.VCF"
declare -a begin_a=(`\
 grep -n "BEGIN:VCARD" ${infile} |\
 awk -F":" '{print $1}' \
`)
declare -a end_a=(`\
 grep -n "END:VCARD" ${infile} |\
 awk -F":" '{print $1}' \
`)

for (( seq=1; seq<=${#end_a[@]}; seq++ ))
do
 seq1=`expr $seq - 1`
 BEGIN=${begin_a[${seq1}]}
 END=${end_a[${seq1}]}

 name=`cat $infile |\
  sed -n ${BEGIN},${END}'p' |\
  grep "^N;" |\
  awk -F"[;:]" '{print $3}'`

 declare -a body=(\
 `cat $infile |\
  sed -n ${BEGIN},${END}'p'` \
 )

 echo $seq ${name}

 for (( i=0; i<${#body[@]}; i++ ))
 do
  echo $seq ${body[$i]}
 done

done

上記のシェルスクリプトでは、vCardを登録人数分に切り分けて名前(変数$name)を表示します。最初に配列変数 ${begin_a} と ${end_a} を定義した時点で、そのファイルのBEGIN:VCARDとEND:VCARDが何行目なのか全て把握しているため、変数$seqに任意の数字を指定するだけで、N枚目のアドレスを抽出できるようになっています。

ところで、実際にアドレス編集を行うにあたっては「グループ」の扱いが厄介そうです。X-GNO、X-GN、X-DCM-GN-ORIGINLの各フィールドが、それぞれ整合していないとエラーになってしまいます。しかもX-GNOは携帯電話でグループの並び替えをする都度値が変化してしまいます。

また、固定電話はTEL;VOICE:というフィールドなのですが、FAXの場合はTEL;WORK;FAX:というフィールドと X-DCM-TEL-ORIGINAL;WORK;FAX: フィールドが一致していないと認識してもらえないという冗長な構造になっているようです。

いずれにしても、大切なアドレス帳を壊してしまいかねませんので、編集の過程を頻繁に別メディアへ保存しておくなどして作業は慎重に行うようにしましょう。

編集後、再度データコピーアプリの復元機能を使用すると、編集結果が携帯電話本体のアドレス帳に反映されます。このとき、SD_PIMの下の同じ名前のファイルが残存しているとバージョン管理が面倒くさいことになりそうですので、別メディアにバックアップしたうえで削除しておいた方が良さそうです。