vCalendarからLXへ予定シンクロ
パッケージ使ってLXで動かなかったボケは素です。(汗
LXで移動中にぷちぷちスクリプト組んで、どうやらケータイから直接LXへ差分予定を自動取り込みすることができました。WINDOWS PCは必要ありません。ケータイでスケジュールをminiSDにバックアップ、LXに挿して、
A:\PRIVATE\AU\BU\B_SL\SL__000?.VCS
のうち最新のタイムスタンプのファイルをC\にコピーします。
フラッシュを元に戻して、以下のスクリプトをバッチから実行すれば、ケータイで登録されてLXになかった予定だけAPPOINTMENTSに登録されます。
#!/usr/bin/perl # auケータイW32TスケジュールバックアップデータからLXへシンクロ用CSV作成 # ケータイの吐くvCalendar形式とLXのapptout形式を比較 # 2005/12/29 LX上で動くJPerl4用。appt.adbへの追加用差分出力。$jst = 9;
@mdays = ('0', '31', '28', '31', '30', '31', '30',
'31', '31', '30', '31', '30', '31' ) ;# メモと件名のシンクロ判定を何文字で行うか
$chkchr = 10;if ($#ARGV < 2) {
die "usage: $0 vcalendar.dat appt.csv addappt.csv\n";
}open(INVCL, "<$ARGV[0]") || die "Can't open $ARGV[0]";
open(INLX, "<$ARGV[1]") || die "Can't open $ARGV[1]";
open(OUTAP, ">$ARGV[2]") || die "Can't open $ARGV[2]";$line =
;
if ($line !~ /^BEGIN:VCALENDAR/){
print $_;
die "not VCALENDAR!\n";
}
$cntevt = 0;
@vcalarr = '';
while($line=){
if ($line =~ /^BEGIN:VEVENT/){
$kenmei='""'; $kaisibi='""'; $kaisi='"00:00"'; $syuryo='"00:00"';
$location='""'; $memo='""';
}elsif ($line =~ /^END:VEVENT/){
$outline = $kenmei .','. $kaisibi .','. $kaisi .','. $syuryo;
$outline = $outline .','. $location .',"0",'. $memo;
$vcalarr[$cntevt] = "$outline\n" if ($outline ne '"0"');
$cntevt++;
}elsif ($line =~ /^DTSTART/){
@arr = split(/:/, $line);
$kaisibi = '"'. substr($arr[1],0,4) .'/'. substr($arr[1],4,2) .'/'. substr($arr[1],6,2) .'"';
$timehour = substr($arr[1],9,2) + $jst;
if ($timehour > 23){
$timehour = $timehour - 24;
@datearr = split('/', $kaisibi);
$date = substr($datearr[2],0,2);
$mon = $datearr[1];
$year = substr($datearr[0],1,4);
$date ++;
if ($date > $mdays[$mon]){
if (($mon == 2) &&
((($year % 4) == 0) && ( ($year % 100) || (($year % 400)==0) ))){
;
}else{
$date = 1;
$mon++ ;
if ($mon > 12){
$year++;
$mon = 1;
}
}
}
$kaisibi = sprintf("\"%04d/%02d/%02d\"", $year, $mon, $date);
}
$kaisi = '"'. sprintf("%02d", $timehour) .':'. substr($arr[1],11,2) .'"';
}elsif ($line =~ /^DTEND/){
@arr = split(/:/, $line);
$timehour = substr($arr[1],9,2) + $jst;
$timehour = $timehour - 24 if ($timehour > 23);
$syuryo = '"'. sprintf("%02d", $timehour) .':'. substr($arr[1],11,2) .'"';
}elsif ($line =~ /^SUMMARY;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$kenmei = '"' . $qpstr . '"';
}elsif ($line =~ /^LOCATION;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$location = '"' . $qpstr . '"';
}elsif ($line =~ /^DESCRIPTION;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$memo = '"' . $qpstr . '"';
$memo =~ s/\n/\\n/g;
}
}$maxvcal = @vcalarr;
@flagarr = '';while($lxline =
){
@lxarr = split(/,/, $lxline);
$cntarr = @lxarr;
if ($cntarr < 8){
$newitem = "YES";
for ($i = 0; $i < $maxvcal; $i++){
$vcalline = $vcalarr[$i];
@evtarr = split(/,/, $vcalline);
$lxarr[2] =~ s/NONE/00:00/g;
$lxarr[3] =~ s/NONE/00:00/g;
$evtarr[6] =~ s/\\n//g;
$lxarr[6] =~ s/\\n//g;
if (
substr($lxarr[0], 0, $chkchr) eq substr($evtarr[0], 0, $chkchr) &&
$lxarr[1] eq $evtarr[1] &&
$lxarr[2] eq $evtarr[2] &&
$lxarr[3] eq $evtarr[3] &&
$lxarr[4] eq $evtarr[4] &&
substr($lxarr[6], 0, $chkchr) eq substr($evtarr[6], 0, $chkchr)
) {
$flagarr[$i] = 'FOUND';
}
}
}
}
for ($i = 0; $i < $maxvcal; $i++){
print OUTAP "$vcalarr[$i]" if ($flagarr[$i] !~ /FOUND/);
}close(INOL);
close(OUTAP);
vCalendar(ケータイW32T等バックアップファイル)→LXシンクロ用サンプルバッチファイルは、以下の通りです。
rem auのケータイW32TスケジュールバックアップからLXのAppointmentsへ登録
rem SDからコピー
copy APPT.ADB APPTOLD.ADB
copy A:\_DAT\APPT.ADB
for %%F in (C:\SL__000*.VCS) DO copy %%F vcal.dat
rem appointmensのデータをCSVへ
apptout -a -x appt.adb >appt.csv
apptout -e -x appt.adb >>appt.csv
rem 差分csv生成au vCalendar to LX
perl vcal2lx.pl vcal.dat appt.csv newappt.csv
rem 新adb生成
apptout -x appt.adb -i newappt.csv -o newappt.adb -arem \_DATへコピー
echo APPT.ADBを更新します。
copy A:\_DAT\APPT.ADB A:\_DAT\APPTOLD.ADB
copy NEWAPPT.ADB A:\_DAT\APPT.ADB
| 固定リンク
コメント