ActivePerlではなく、shift_jisで半角カタカナの処理ができるようにしてあるJPerl.exeという別種のPerlを使って処理する方法です。
パターンマッチ処理によって、1文字ずつ変換していきます。項目に含まれる全角スペースは半角スペースになっている点に注意してください。
実際に応用する場合は、入出力データのファイル名等を変更するとともに、半角カナ文字がある項目(下記では3番目の項目にしている)を指定して、利用します。
# z2hkana1.pl
# 内容 : 全角カナを半角カナに変換する
# 前提 : 入力ファイルはshift-jis、スクリプトはshift-jisとすること
# 「JPerl」でのみ動作可能(通常のperlでは動作不可)
# Copyright (c) 2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>jperl z2hkana1.pl
#
open(IN1,"input_sjis.txt");
open(OUT1,">output_sjis.txt");
while ($line1 = <IN1>) {
chomp($line1);
$line1 =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@in1 = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line1 =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
$temp = $in1[2];
#
# 濁音の処理
#
$temp =~ s/([ガギグゲゴザジズゼゾダヂヅデドバビブベボ])
/pack("n",unpack("n",$1) - 1)."゛"/ge;
#
# 半濁音の処理
#
$temp =~ s/([パピプペポ])/pack("n",unpack("n",$1) - 2)."゜"/ge;
#
# ヴ の処理
#
$temp =~ s/ヴ/ウ゛/g;
#
# 全角を半角に
#
$temp =~ tr/。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソ
タチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜/\xA1-\xDF/;
#
# 全角スペースは半角スペースに
#
$temp =~ s/ / /g;
#
# 出力
#
$in1[2] = $temp;
$line1 = join("\t",@in1);
print OUT1 "$line1\n";
}
close(IN1);
close(OUT1);
スクリプトを実行するのに、最低限必要なJPerl.exeはこちらにあります。
このスクリプトを動作させるために最低限必要なJPerlを上記からダウンロードした上で、zipファイルを解凍し、JPerl.exeと同じフォルダに入力ファイルとスクリプトを入れた上で実行してください。
スクリプトはこちらにあります(必ずshift_jisで保存してください)。
入力データはこちらにあります(必ずshift_jisで保存してください)。
"0100","ABC","[]@!#$%&<>'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ"
"0110","ABC","[]@!#$%&<>'()*+,-./ "
"0120","ABC","0123456789"
"0130","ABC","ABCEFGabcefg"
"0140","ABC","アイウエオガザダバパヴ"
"0150","ABC","カガ タダヒコ"
"0160","ABC","スズキ ココロ"
"0170","ABC","ジョン・スミス"
"0200","DEF","[]@!#$%&<>'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ"
"0210","DEF","[]@!#$%&<>'()*+,−./ "
"0220","DEF","0123456789"
"0230","DEF","ABCDEFGabcdefg"
"0240","DEF","アイウエオガザダバパヴ"
"0250","DEF","カガ タダヒコ"
"0260","DEF","スズキ ココロ"
"0270","DEF","ジョン・スミス"
0100 ABC []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ
0110 ABC []@!#$%&'()*+,-./
0120 ABC 0123456789
0130 ABC ABCEFGabcefg
0140 ABC アイウエオガザダバパヴ
0150 ABC カガ タダヒコ
0160 ABC スズキ ココロ
0170 ABC ジョン・スミス
0200 DEF []@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
0210 DEF []@!#$%&'()*+,−./
0220 DEF 0123456789
0230 DEF ABCDEFGabcdefg
0240 DEF アイウエオガザダバパヴ
0250 DEF カガ タダヒコ
0260 DEF スズキ ココロ
0270 DEF ジョン・スミス