こんにちは、樋口です。
今回はKH Coderの動作確認のために、大切なデータを拝見させていただき
まして、大変ありがとうございました。おそらく、問題は解決したと思い
ますので、お送りいただいたデータは削除させていただきました。
(もし解決していなかった場合には再度ご連絡下さいませ)
データファイル中に制御文字や文字化け箇所があると、トラブルが生じる
場合があるわけですが、以下に、自分の備忘用途もかねて、今回使用した
Perlスクリプトを貼っておきます。改行文字を除く制御文字を半角スペー
スに置換し、文字化けを含む行を削除するというものです。文字化け箇所
を完全に取り除くことはできていないと思いますが、文字コード判別に影
響を及ぼすような"致命的"な部分は削除できると思います。
(利用にはPerlが必要になります)
------------------------------------------------------------------
# ユーザー設定
my $file_in = "hoge.txt"; # 入力ファイル(S-JIS)
my $file_out = "hoge_ed.txt"; # 出力ファイル
# 設定
use strict;
use Jcode;
my $ascii = '[\x00-\x7F]';
my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
my $ctrl = '[[:cntrl:]]'; # 制御文字
my $rep = ' '; # 制御文字の置換用
my $character_undef = '(?:[\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|' # 9-15,85-94区
. '\x8E[\xE0-\xFE]|' # 半角カタカナ
. '\xA2[\xAF-\xB9\xC2-\xC9\xD1-\xDB\xEB-\xF1\xFA-\xFD]|' # 2区
. '\xA3[\XA1-\xAF\xBA-\xC0\xDB-\xE0\xFB-\xFE]|' # 3区
. '\xA4[\xF4-\xFE]|' # 4区
. '\xA5[\xF7-\xFE]|' # 5区
. '\xA6[\xB9-\xC0\xD9-\xFE]|' # 6区
. '\xA7[\xC2-\xD0\xF2-\xFE]|' # 7区
. '\xA8[\xC1-\xFE]|' # 8区
. '\xCF[\xD4-\xFE]|' # 47区
. '\xF4[\xA7-\xFE]|' # 84区
. '\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト文字
# 処理の開始
open (OUT,">$file_out") or die;
open (IN,$file_in) or die;
binmode (IN);
my $n = 0; # 文字化けのあった行を数えるカウンタ
while (<IN>){
chomp;
my $t = Jcode->new($_,'sjis')->h2z->euc;
if (
$t =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$character_undef)/
) { # 文字化けがあった場合
# ファイルには出力せずにカウント
print "$_\n";
++$n;
} else { # 文字化けがなかった場合
# 制御文字を置換して出力
$t =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$ctrl)/$1$rep/g;
print OUT Jcode->new($t,'euc')->sjis,"\n";
}
}
close (IN);
close (OUT);
print "lines deleted: $n\n";