|
よんどころない事情にて mbox 形式のメールファイルの From 欄を抜き出して、PostPet2001 for Windows のおともだち帳を作らなくてはならなくなりました。
まず、ポストペットのアドレス帳形式なんて知らないので、まずは google で検索してみますが、からっきしヒットしません。仕方ないので、自分で調べることにしました。以下、作業は cygwin のコンソール上で行います。
まず数件の適当なデータのみのアドレス帳を作り、直接エディタで開いてみます。が、さすがにバイナリデータのようでうまく表示されません。ただし、入力したペットの名前などはそのまま入っているようです。
次に、HEX ダンプをみてみます。od -x すると割と簡単にだいたい以下のようなレコード形式だということがわかりました。
- 先頭4バイト:ペットの種類。
- 0がポストマンのようです。
- ペットの名前
- 可変長(<255文字) の Shift-JIS パスカル文字列。名無しなら NULL 文字(0x00)。
- 飼い主の名前
- 可変長(<255文字) の Shift-JIS パスカル文字列。名無しなら NULL 文字(0x00)。
- メールアドレス
- 可変長(<255文字) の ASCII パスカル文字列。
- 末尾4バイト:セパレータ。
- すべて0(00 00 00 00)。
- ※パスカル文字列というのはNULLで終わるのではなく先頭に1バイトで文字列長を置く文字列形式です。
というわけで、ペットの種類は「ポストマンに固定」かつペットの名前は「なし」にして、 From 欄の名前を「飼い主の名前」にするといった仕様でよさそうです。
あとはフィルタを作るだけです。同じ人からの複数のメールから複数のおともだち帳レコードを作らないようにするのに sort と uniq コマンドを使いたかったので、前処理(mboxからメールアドレスと名前を抜く)と後処理(メールアドレスと名前からアドレス帳を生成)用の2つの Perl スクリプトを書くことにしました。
後処理はこんな感じです。
#後処理では、前処理で
# 名前\tメールアドレス
#という形式で書き出したファイルを sort|uniq したものを読み込みます。
$separator = pack("CCCC",00,00,00,00);
$dammy = pack("C",00);
while(<>){
$line = $_;
$line =~ s/^M//;
($name,$address) = split(/\t/,$line);
$nlength = pack("C",length($name));
$alength = pack("C",length($address));
printf $separator.$dammy.$nlength.$name.$alength.$address.$separator;
}
というわけで、無事おともだち帳を生成することができました。
|