OperaのコンタクトリストをThunderbirdのアドレス帳にインポートするためのCSVに変換する

先日、OperaのM2からPortable Thunderbirdに乗り換えた。

メールのデータ自体はGmailにまとめていたものをダウンロードしただけなので問題なかったのだけど、アドレス帳の移行がうまくいかなかった。http://d.hatena.nh.jp/goking/20041224で公開されているsedが動けばOK。と思って試したけどなんかエラーを吐いて動かなかった。で、適当にPerlで書いてみたのが下

使い方は、至って普通
+適当にプログラムを保存する
+ENDの下にOperaからエクスポートしたcontacts.adrの内容をこぴぺ
+Perlでプログラム実行
+標準出力に名前とメールアドレスだけのCSVが出てくるので保存

|perl|

OperaのコンタクトリストをThunderbirdのアドレス帳にインポートするためのCSVに変換する

use strict;
use warnings;

各種設定

取得する文字列の区切りを空行に設定

$/ = "\n\n";
$\ = "\n";

必要そうな変数を設定

my $addr;
my $type;
my @folder;

foreach $addr () {
my %address;

# アドレスの種別を取得する
$type = $addr =~ s/^(.+\n)// ? $1: "";

# 対象によって処理の振り分け
# 必要な処理があれば適当に書く
if($type =~ /^#FOLDER/) {
%address = parse_address($addr);

# フォルダのスタックにプッシュする  
push(@folder, $address{'NAME'});  

}
elsif($type =~ /^#CONTACT/) {
%address = parse_address($addr);

# 面倒なので、ここで出力してしまう  
print "\"$address{'NAME'}\", $address{'MAIL'}, " ;

}
elsif($type =~ /^-/) {
# フォルダのスタックからポップする
# 取り出したものは読み捨て
pop(@folder);
}
else {
# 特に無し
}

}

一つのアドレスブロックを受け取り、

各フィールド名をキーとしたハッシュを返す

sub parse_address {
my $address = shift;
my %addr;

# アドレスごとにフィールドに分割して  
#   乱暴に連想配列に突っ込みなおす  
foreach my $field ( split(/\n/, $address)) {  

$field =~ s/^\s+//o;
my ($title, $value) = split("=", $field, 2);

$addr{$title} = $value;

}

return(%addr);  

}

Operaからエクスポートしたcontacts.adrENDの下に貼り付ける

END
Opera Hotlist version 2.0
Options: encoding = utf8, version=3

FOLDER





||<

コマンドラインからファイル名を指定したりなんだりは無視する。一発もののプログラムを書くときには、END以下に直接データを書くのが一番お手軽な気がする

ちなみに、コメントは作った後で書いてみたので嘘が混じってるかもしれません。大体フォルダ名とか取得してるけど結局何も使ってない。そもそもフォルダをきちんと分けて管理なんかしていないのでそこも無問題