« 粉雪 | トップページ | カバンの中身バトン »

2006/01/03

LXのvCalendarをiPAQへ

LXからPocketPC用vCalendar形式データも生成できました。
PocketPC(iPAQ h4150)でvCalendar形式をタップして取り込むには、一予定一ファイルにする必要があります。LXのapptoutによるcsvを読んでファイルを分けてvCalendarを生成するスクリプトを組んでみました。
PocketPC2003では、拡張子が大文字の「VCS」だと駄目で、小文字の「vcs」にリネームする必要があります。これはLX上ではできないので、h4150にvCalendarファイルを移してから、GSFinder+でリネームして試しました。
とりあえずうまく動いて、HP200LXの予定データをLX上でvCalendarデータに変換し、iPAQ h4150で取り込むことができました。

--------------------


#!/usr/bin/perl
# LXのapptout出力csvからvCalendar形式へ変換
# 2005/12/30 W32T用試作
# 2005/12/31 W32Tバックアップ形式(複数イベント1ファイル)生成
# 2006/1/3 PocketPC2003 iPAQ h4150用にイベント毎別ファイル形式に対応

# 連番付出力vcsファイルの前半固定部分(PIMならPIM0001.VCS PIM0002.VCS...)
$base = 'PIM';
# memoを何文字で切るか(ケータイなら80程度)
$maxlen = 4096;

if ($#ARGV < 0) {
die "usage: $0 appt.csv basename maxlength\nex) jperl $0 appt.csv PIM 70\n";
}
$base = $ARGV[1] if ($ARGV[1] ne '');
$base = substr($base, 0, 4) if (length($base) > 4);
$maxlen = $ARGV[2] if ($ARGV[2] ne '');
open(IN, "<$ARGV[0]") || die "Can't open $ARGV[0]";
open(OUTINDX, ">$base"."IDX.TXT") || die "Can't open $baseIDX.TXT";

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

while($line = <>){
@arr = split(/,/, $line);
$cntarr = @arr;
if ($cntarr < 8){
$cntf++;
$fname = sprintf("%s%04d.vcs", $base, $cntf);
open(OUT, ">$fname") || die "Can't open $fname";
print OUT 'BEGIN:VCALENDAR';
print OUT "\n";
print OUT 'VERSION:1.0';
print OUT "\n";
print OUT 'BEGIN:VEVENT';
print OUT "\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 OUT 'DTSTART:';
print OUT sprintf("%04d%02d%02dT%02d%02d00Z",$year,$mon,$date,$hour,$min);
print OUT "\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 OUT 'DTEND:';
print OUT sprintf("%04d%02d%02d\T%02d%02d00\Z",$year,$mon,$date,$hour,$min);
print OUT "\n";
print OUT 'SUMMARY;ENCODING=QUOTED-PRINTABLE:';
$summary = substr($arr[0],1,length($arr[0])-2);
# $summary = substr($summary,0,$maxlen) if(length($summary) > $maxlen);
# $summary =~ s/(([\201-\237\340-\374][\100-\377])+)[\201-\237\340-\374]$/$1/g;
$summary =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print OUT $summary;
print OUT "\n";
$summary =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
print OUTINDX "$fname: $summary\n" ;
print OUT 'CATEGORIES:MISCELLANEOUS';
print OUT "\n";
$summary =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
print STDOUT $summary;
print STDOUT "\n";
$location = substr($arr[4],1,length($arr[4])-2);
if ($location ne ''){
print OUT 'LOCATION;ENCODING=QUOTED-PRINTABLE:';
# $location = substr($location,0,$maxlen) if(length($location) > $maxlen);
# $location =~ s/(([\201-\237\340-\374][\100-\377])+)[\201-\237\340-\374]$/$1/g;
$location =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print OUT $location;
print OUT "\n";
}
print OUT 'CLASS:PUBLIC';
print OUT "\n";
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year = $year + 1900;
$mon = $mon + 1;
print OUT 'LAST-MODIFIED:';
print OUT sprintf("%04d%02d%02dT%02d%02d%02dZ",$year,$mon,$day,$hour,$min,$sec);
print OUT "\n";
$memo = substr($arr[6],1,length($arr[6])-3);
if ($memo ne ''){
print OUT 'DESCRIPTION;ENCODING=QUOTED-PRINTABLE:';
$memo = substr($memo,0,$maxlen) if(length($memo) > $maxlen);
# $memo =~ s/^(([\W\w\s\S])+)[\201-\237\340-\374]$/$1/g;
# $memo =~ s/(([\201-\237\340-\374][\100-\377])+)[\201-\237\340-\374]$/$1/g;
chop $memo if ($memo =~ /[^\W\w\s\S]$/);
$memo =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print OUT $memo;
print OUT "\n";
}
print OUT 'END:VEVENT';
print OUT "\n";
print OUT 'END:VCALENDAR';
print OUT "\n";
close(OUT);
}
}
close(IN);
close(OUTINDX);

-------------------- 変換はたとえばこんな感じ。 jperl csv2vcs.pl pim.csv

JPerlなので、maxdosか生DOSで動かします。

|

« 粉雪 | トップページ | カバンの中身バトン »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: LXのvCalendarをiPAQへ:

» EZweb での vCalendar スケジュールデータのダウンロード [The Blog of Drian Grey]
うまくいかない。これ (上のQRコードのURL) をダウンロードしても、「未対応のデータです」となる。 サーバーが返す、Content-type を見ると Content-type: text/x-vcalendar; charset=Shift_JIS となっている。セミコロンの後にスペースが空いているのが気になるが、おそらくこれでいいのだろう。 もし、これを見てる人でvCalendar対応のケータイを使っている方は、デー... [続きを読む]

受信: 2006/01/31 23:17

« 粉雪 | トップページ | カバンの中身バトン »