« vCalendarからLXへ予定シンクロ | トップページ | 謹賀新年 »

2005/12/31

LXでvCalendar作成!

vCalendarをLXに取り込むことはできました。あとはLXからvCalendar形式データを生成できれば全部つながりそうです。

エンコードもLX上でできるようにJPerlで書きました。青春18きっぷで東海道線を延々西へ乗りながらLXでぷちぷちとスクリプトを組みます。
LX上でAPPTOUTで予定をCSVにしておき、このCSVをvCalendar形式に変換するスクリプトを書きました。
--------------------


#!/usr/bin/perl
# LXのapptout出力csvからvCalendar形式へ変換
# 2005/12/30 W32T

# memoやlocationや件名を何文字で切るか
$maxlen = 70;

$jst = 9;
@mdays = ('31', '31', '28', '31', '30', '31', '30',
'31', '31', '30', '31', '30', '31' ) ;

print 'BEGIN:VCALENDAR';
print "\n";
print 'VERSION:1.0';
print "\n";
# print 'PRODID:LXPERL';
# print "\n";

while($line = <>){
@arr = split(/,/, $line);
$cntarr = @arr;
if ($cntarr < 8){
print 'BEGIN:VEVENT';
print "\n";
@datearr = split("/", substr($arr[1],1,10));
$year = $datearr[0];
$mon = $datearr[1];
$date = $datearr[2];
if ($arr[2] eq 'NONE') {
$hour = 0;
$min = 0;
} else {
@timearr = split(/:/, substr($arr[2],1,5));
$hour = $timearr[0];
$min = $timearr[1];
}
$hour = $hour - $jst;
if ($hour < 0) {
$hour = $hour + 24;
$startdateflag = 'CHANGE';
$date--;
if ($date < 1) {
$mon = $mon - 1;
$date = $mdays[$mon];
$date++ if (($mon == 2) &&
((($year % 4) == 0) &&
( ($year % 100) || (($year % 400)==0) )));
if($mon < 1){
$mon = 12;
$year--;
}
}
}
print 'DTSTART:';
print sprintf("%04d%02d%02dT%02d%02d00Z",$year,$mon,$date,$hour,$min);
print "\n";
if ($arr[3] eq 'NONE') {
$hour = 0;
$min = 0;
} else {
@timearr = split(/:/, substr($arr[3],1,5));
$hour = $timearr[0];
$min = $timearr[1];
}
$hour = $hour - $jst;
if ($hour < 0) {
$hour = $hour + 24;
} else {
if ($startdateflag eq 'CHANGE'){
@datearr = split("/", substr($arr[1],1,10));
$year = $datearr[0];
$mon = $datearr[1];
$date = $datearr[2];
}
}
print 'DTEND:';
print sprintf("%04d%02d%02d\T%02d%02d00\Z",$year,$mon,$date,$hour,$min);
print "\n";
print 'SUMMARY;ENCODING=QUOTED-PRINTABLE:';
$summary = substr($arr[0],1,length($arr[0])-2);
$summary = substr($summary,0,$maxlen) if(length($summary) > $maxlen);
$summary =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $summary;
# $summary =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $summary;
print "\n";
print 'CATEGORIES:MISCELLANEOUS';
print "\n";
$location = substr($arr[4],1,length($arr[4])-2);
if ($location ne ''){
print 'LOCATION;ENCODING=QUOTED-PRINTABLE:';
$location = substr($location,0,$maxlen) if(length($location) > $maxlen);
$location =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $location;
# $location =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $location;
print "\n";
}
print 'CLASS:PUBLIC';
print "\n";
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year = $year + 1900;
$mon = $mon + 1;
print 'LAST-MODIFIED:';
print sprintf("%04d%02d%02dT%02d%02d%02dZ",$year,$mon,$day,$hour,$min,$sec);
print "\n";
$memo = substr($arr[6],1,length($arr[6])-3);
if ($memo ne ''){
print 'DESCRIPTION;ENCODING=QUOTED-PRINTABLE:';
$memo = substr($memo,0,$maxlen) if(length($memo) > $maxlen);
$memo =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $memo;
# $memo =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $memo;
print "\n";
}
print 'END:VEVENT';
print "\n";
}
}
print 'END:VCALENDAR';
print "\n";

-------------------- 変換はたとえばこんな感じ。 rem LXのapptoutでのcsv形式から、vCalendar形式へ perl csv2vcal.pl appt.csv >testvcal.txt

で、W32TのminiSDのAU_INOUTフォルダに入れてデータフォルダに振り分け、PIMデータを取り込めば完了です。

PocketPC(h4150)でもvCalendar形式をタップすれば取り込めたな、と試してみます。W32Tのバックアップデータのような複数予定を1ファイルにしたVCSは最初の一つしか取り込めないようです。また、拡張子が大文字の「VCS」だと駄目で、小文字の「vcs」にリネームしただけで取り込めるようになりました。

vCalendarは汎用的に使えるようなので面白そうです。

|

« vCalendarからLXへ予定シンクロ | トップページ | 謹賀新年 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/69188/7930422

この記事へのトラックバック一覧です: LXでvCalendar作成!:

« vCalendarからLXへ予定シンクロ | トップページ | 謹賀新年 »