LoginSignup
1
0

More than 5 years have passed since last update.

iCalのデータからイベント一覧を取り出す

Last updated at Posted at 2015-07-14

OS X の iCal でイベントを細かく管理していると、過去にどんなことが有ったのかの記録に使えるぞ、と思いました。

やりたかったこと

iCalでカレンダーの書き出しをすると、vCalendar 形式のファイル(拡張子は .ics)で出力されます。
こんな感じ

BEGIN:VEVENT
UID:11A04694-11B0-4053-984C-700328F928BF
DTSTAMP:20150808T044239Z
LOCATION:
TRANSP:OPAQUE
SUMMARY:重要な会議だよ
SEQUENCE:0
DTEND;TZID=Asia/Tokyo:20150802T103000
DTSTART;TZID=Asia/Tokyo:20150802T093000
END:VEVENT

このままでは検索性や一覧性に欠けるので、次のような日時とイベントタイトルが一行になったテキストデータに変換しようと考えました。

2015/08/02-09:30 重要な会議だよ

プログラム

OS Xには Perl が標準で入っているので、Perl で書いたプログラムです。

iCalSel.pl
#!/usr/bin/perl
#### use encoding 'utf8', STDOUT=>'shiftjis';
while(<>) {
     ($EventName, $EvantData, $EventTime) = "" if(/BEGIN:VEVENT/) ;
     chop;
     chop;
    $EventName =  $1 if(/SUMMARY:(.+)/);
    $EventDate  = substr($1, 0, 4) . '/' . substr($1, 4, 2) . '/' . substr($1, 6, 2)  if(/DTSTART;.+:([0-9]+)/);
    $EventTime  = substr($1,1, 2) . ':' . substr($1, 3, 2)  if(/DTSTART;.+:[0-9]+(T[0-9]+)/);
    if (/END:VEVENT/) {
        $wk = substr($EventDate,0,10) . "-$EventTime  " . $EventName . "\n";
        printf($wk) if (/END:VEVENT/);
    }
}

二行目はコメントアウトしていますが、出力したい文字コードを変更したい場合に書き換えて利用してください。 use encoding 'utf8', STDOUT=>'shiftjis';

利用方法

このプログラムを保存して実行権限を与えたら、ターミナルで以下のようにコマンドを実行します。

$ cat (iCalで書きだしたファイルパス) | iCalSel.pl | sort > (結果を書き出すファイルパス)
(例) $ Cat 2015Calendar.ics | iCalSel.pl | sort > 2015Cal.txt

cat を使うと、複数のカレンダーを一括で処理できます。
$ cat Calendars/* | iCalSel.pl | sort >iCalAllData.txt

お役に立てば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0