いままでずーっと Palm(正確に言えばソニーの Clie)を使い続けてきたのだけど、やっと後継機へ移行できるような時代になったというわけで、Palm 形式のデータを Android が扱う Google 形式へ移行することにしました。
住所録については、もともと Palm では固定の項目が不足気味だったので、「カミサマ」を CSV で運用していた(CSV から Palm で扱える項目だけ Palm Desktop にインポートして運用していた)のですが、これは Palm Desktop をカミサマにしていた場合でも CSV に出力できるから、それでデータの項目が満足なら同じこと。あとは Gmail の Google CSV 形式に合わせて並び替えてインポートすればいいだけ(とは言うものの、並べ替えにはいろいろ工夫が必要だし、スクリプトも必要だけど・・・ (^.^;))
問題は予定表の方で、標準では Palm から汎用の形式に出力する方法がなく、ググってみるといろいろな手段があるらしいのだけど、どれもイマイチな部分があるので、結果として、以下に見つけてきた情報から perl スクリプトを使って iCalendar 形式にすることにしました。
知らなかったけど、p5-Palm なんていう perl ライブラリーが作られてたのね!
上記ページには、そのライブラリーを使った pdatebook2ical.pl というスクリプトが紹介されているのだけど、そのままではいくつか問題があったので、改造して使いました。
—– ここから diff —–
*** original/pdatebook2ical.pl 2010-08-25 13:02:35.000000000 +0900
— pdatebook2ical.pl 2010-08-25 12:59:14.000000000 +0900
***************
*** 8,20 ****
use Encode qw/ from_to /;
my $default_clss = “PRIVATE”;
! my $private_disp = 0; # you can out put private records.
my $location_delimiter =” “; # delimiter between summary & location
my $codeset = “utf8”; # output codeset
! my $dbfile = “$ENV{HOME}/.jpilot/DatebookDB.pdb”;
! my $icsfile =”$ENV{HOME}/.evolution/calendar/local/system/calendar.ics”;
! # my $icsfile =”/media/iPod/Calendars/calendar.ics”;
my $data_server = “evolution-data-server-1.4”;
— 8,19 —-
use Encode qw/ from_to /;
my $default_clss = “PRIVATE”;
! my $private_disp = 1; # you can out put private records (=1) or out put public records only (=0).
my $location_delimiter =” “; # delimiter between summary & location
my $codeset = “utf8”; # output codeset
! my $dbfile = “$ENV{PWD}/DatebookDB.pdb”;
! my $icsfile =”$ENV{PWD}/calendar.ics”;
my $data_server = “evolution-data-server-1.4”;
***************
*** 59,86 ****
$summary =~ s/n//g;
! my @tmp = split($location_delimiter, $summary);
! $tmp[0] =~ s/ *$//;
! print “SUMMARY:$tmp[0]n”;
!
! if ($tmp[1] ne “”) {
! print “LOCATION:$tmp[1]n”;
! }
# Class
! if ($record->{“attributes”}{“private”} == 1) {
! $class = “CONFIDENTIAL”;
! } else {
! $class = $default_clss;
! }
! print “CLASS:$classn”;
# Description
if ($record->{note} ne “”) {
$description = $record->{note};
from_to($description, “shiftjis”, $codeset);
$description =~ s/n/N/g;
print “DESCRIPTION:$descriptionn”;
}
— 58,88 —-
$summary =~ s/n//g;
! # my @tmp = split($location_delimiter, $summary);
! # $tmp[0] =~ s/ *$//;
! # print “SUMMARY:$tmp[0]n”;
! print “SUMMARY:$summaryn”;
!
! # if ($tmp[1] ne “”) {
! # print “LOCATION:$tmp[1]n”;
! # }
# Class
! # if ($record->{“attributes”}{“private”} == 1) {
! # $class = “CONFIDENTIAL”;
! # } else {
! # $class = $default_clss;
! # }
! # print “CLASS:$classn”;
# Description
if ($record->{note} ne “”) {
$description = $record->{note};
from_to($description, “shiftjis”, $codeset);
+ my @tmp = split(‘n’, $description);
+ print “LOCATION:$tmp[0]n”;
$description =~ s/n/N/g;
print “DESCRIPTION:$descriptionn”;
}
—– ここまで —–
変更点最初は private レコードを出力するようにしている部分 (どうせ private のレコードは使ってなかったので関係ないけど・・・) と、ファイルのパス。そして、コード部分の変更点の大きなところは、オリジナルでは予定のタイトルを空白区切りでタイトルと場所に分けている (そういう運用をしている?) ようなんだけど、これだとタイトル内に空白が入っているものが切られちゃうので「そのまま全文」 SUMMARY に書き出すようにしたのと、逆に僕の場合は予定のコメントの1行目に(主に)場所を入れていたので、それを LOCATION に書き出すようにしたこと。それと、そもそも private のレコードはないし、CLASS を出力する必要がないので、その部分を全部コメントアウトしただけ。
最初にp5-Palm をインストールして、あとは変更した pdatebook2ical.pl と Palm デバイスから取り出してきた DatebookDB.pdb を同じディレクトリーにおいて走らせるだけで、iCalendar 形式の calendar.ics が同じディレクトリーに出力されます。くり返しデータもうまく出力されているようで、この方法が一番簡単で、完璧でしょう!!
最後の問題は、僕の予定表データは 1987 年(Macintosh SE を買って、Hyper Card で予定を管理し始めた時代)からの予定を全部、PDA の世代が変わるごとにデータを手動で移し続け、日記代りに持っているので、上で作成した calendar.ics が巨大なこと!
Google Calendar でインポートすると、何度やっても途中で「サーバーが反応しません」みたいなエラーになってしまいます・・・
が、どうもアップロード自体は出来ているようで、サーバー側が処理をするのに時間がかかりすぎて反応がなくなってるだけのようにも見える・・・
で、インポートされたものをエクスポートして、比較しやすいように perl スクリプトを作って SUMMARY と DTSTART を調べてみると、Palm から移すために作った方は Time Zone 情報がないけど、Google からエクスポートした方は Time Zone 情報があるため、DTSTART がオフセットしちゃってること、及びエクスポートした方は SUMMARY に含まれるカンマがエスケープされていることを除くと、なぜか不思議と1つのデータだけが入力に失敗しただけのようです! (^-^)/
そんなわけで、インポートに失敗したデータを手入力して、無事完了!あとは、タイムゾーン情報なしで扱っていたもの(つまり、今まで扱っていた「時刻」は、すべて「現地」時刻・・・というか、Palm の仕様自体がそういう仕様だった・・・)を、タイムゾーン情報ありに移行(多分手動で?)するかどうかが悩ましいところだなぁ・・・
住所録の方は、それまで「カミサマ」にしていた CSV から一旦扱いやすい PowerAddress というアプリにインポートした(今後は編集しやすい PowerAddress を「カミサマ」にする)ところまで済ませてあったので、ここから小細工のしやすい CSV 形式に出力して、これまた perl スクリプトで並べ替えて(一部単なる並べ替えじゃない操作も多少あるけど・・・) Google CSV 形式にしてインポートしました。
本当は、Google へインポートした後は Google をカミサマにしたいところ(そうすれば、PC で Web 上を書き換えても、Android で書き換えてもシンクしてくれて便利)なんだけど、まだまだ Gmail の Contacts には日本語(というか、日本の住所や姓・名の表記の順番、ヨミガナなど)に絡むのか、「フルネーム」を1つのフィールドとして入力することも、「姓」と「名」を別々に入力することも両方できるのだけど、そこに妙な挙動があったり、住所も同様にフルで1フィールドとして入力する場合と番地、市、県、国などを別々のフィールドとして入力する場合の妙な挙動があったりすることがわかっているので、少なくとも当面は Clie でやっていた運用と同じように、「カミサマ」の PowerAddress だけを最新に変更しておいて、毎回そこからインポートさせることで運用すればいいかなと・・・というわけで、こちらも完了!!
コメント