2004/01/10(土) [n年前の日記]
#3 [windows] *.dbx→MH形式への変換作業
ようやく上手くいったみたいなのでメモ。まずは、
_DBX Export Tool
を使って、*.dbxを*.emlに変換する。変換する際の設定は、「ファイル名の付け方」→「連番」、「DBXファイルごとにフォルダを作成する」にチェックを入れた状態。下のような感じ。

これで、フォルダ別に、連番の*.emlが作られる。emlファイルは、中身がそのままMH形式として使えるらしいのだけど、それでも、ファイル名と改行コードを変更しなければならない。しかし、フォルダ数が結構あるので手作業ではやってられない。というわけで、以下のようなperlスクリプトを作って作業をした。
以前と違って「^M」なんて出てこないし、大半は内容を読めてるので大丈夫そう。一部のメールが文字化けしてるのが謎だけど。文字コードが違うのかな。

#!/usr/bin/perl
# eml2mh.pl
# ActivePerl 5.6.1 build 635 で使用。
my $convert_use = 1; # 変換処理を行うか (1=yes/0=no)
my $file_delete = 1; # 処理後、.eml を削除するか (1=yes/0=no)
my $file_verbose = 1; # 処理中のファイル名を表示 (1=yes/0=no)
my $dir_verbose = 1; # 処理中のディレクトリ名を表示 (1=yes/0=no)
my $allcnt = 0;
&filesearch(".");
exit;
sub filesearch {
my($dir) = @_;
my $file;
my @files;
my %emlv;
my $eml;
opendir(DIR,"$dir");
@files = sort grep(!/^\./, readdir(DIR));
closedir(DIR);
my @emls = ();
foreach (@files) {
my $file = "$dir/$_";
if (-d $file ) {
&filesearch("$file");
} elsif ( -f $file && $file =~ /\.eml$/ ) {
push(@emls,$file);
}
}
foreach $eml (@emls) {
$eml =~ /^.*\/(\d+)\.eml$/;
$emlv{$eml} = $1;
}
my @emlsort = sort { $emlv{$a} <=> $emlv{$b} } keys %emlv;
my $cnt = 0;
foreach $eml (@emlsort) {
$eml =~ /^(.*\/)(\d+)\.eml$/;
my $p = $1;
my $i = $2;
$allcnt++;
# my $newfn = $p . sprintf("%04d", $i);
# my $newfn = $p . $i;
my $newfn = $p . $allcnt;
print "$newfn <- $eml\n" if $file_verbose;
$cnt++;
if ( $convert_use ) {
my @lines = ();
open(IN,$eml) || die "Can't open $eml";
binmode(IN);
@lines = <IN>;
close(IN);
open(OUT,">$newfn") || die "Can't open $newfn";
binmode(OUT);
foreach(@lines) {
s/\r\n/\n/;
print OUT $_;
}
close(OUT);
if ( $file_delete ) {
unlink($eml) || die "Can't delete $eml";
}
}
}
print "[$dir]\t... convert .eml file = $cnt\n" if $dir_verbose;
}
perlは、ActivePerlを利用。
*1
DOS窓で、
cd 該当フォルダ perl c:\〜\eml2mh.plと打って使う。やってる事は、
- 各ファイル名を、「連番.eml」から「連番」に変更。
- ファイル中のWindows改行コード(\r\n)をUNIX改行コード(\n)に変換。
- サブディレクトリを再帰的に辿って処理する。
- 1Z を入力して、フォルダリストを更新。
- g を入力して、フォルダ名を選択。
- s を入力して、allと打って、サマリを更新。( ~/.mew.el等を修正してサマリ表示形式を変更した場合)
- 読みたいメールの上で、spc を押せば、内容が見れる。
以前と違って「^M」なんて出てこないし、大半は内容を読めてるので大丈夫そう。一部のメールが文字化けしてるのが謎だけど。文字コードが違うのかな。
*1: ちなみに、ActivePerlでファイルを読む場合、何もしないと改行コードがWindows向けに変更されてしまうらしく。binmode(〜) をしておかないとダメみたい。
*2: ちなみに、UNIX環境なら _incなるツールでmbox→mh変換ができる らしいですな。
*2: ちなみに、UNIX環境なら _incなるツールでmbox→mh変換ができる らしいですな。
[ ツッコむ ]
以上です。