ActivePerlでUnicodeモジュールを利用して、半角文字をすべて全角文字に変換する方法です。
UnicodeモジュールはActivePerlでは通常のインストールでインストールされていますので、"use Unicode::Japanese"とするだけで利用できるようになります。下記の例では全角文字をすべて半角文字に変換していますが、"Unicode::Japanese->new($temp)->z2h->get;"の"z2h"の部分を変えると、全角カタカナだけの変換などができるようになります。どのように変換されるかは下記の例を見てください。
【2013/4/9追記】Unicodeモジュールの中にJapaneseモジュールが含まれていないことがあるようです。その場合は、こちらをダウンロードし、C:\Perl\lib\Unicode(またはC:\Perl64\lib\Unicodeなど該当するフォルダ)の配下に保存した後、解凍してください。
【2016/5/28追記】最近のバージョンでは、このスクリプトが実行できないようです。Active Perl 5.12、5.16、5.20で動作しないことを確認しました。
入力データ : []@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2h :[]@!#$%&'()*+,-./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hSym :[]@!#$%&'()*+,-./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hNum :[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hAlpha :[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hKana :[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hKanaK :[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
z2hKanaD :[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ
実際に応用する場合は、入出力データのファイル名等を変更するとともに、半角カナ文字がある項目(下記では3番目の項目にしている)を指定して、利用します。
# z2h_all.pl
# 内容 : 全角文字(英数字、記号およびカナ)を半角文字に変換する
# 前提 : 入力ファイルはUTF-8(BOMなし)、
# スクリプトはUTF-8(BOMなし)とすること
# 通常のperlで動作可能
# Copyright (c) 2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl z2h_all.pl
#
open(IN1,"input_utf8.txt");
open(OUT1,">output_utf8.txt");
use Unicode::Japanese;
while ($line1 = <IN1>) {
# CSV形式の $line1 から値を取り出して @in1 に入れる
chomp($line1);
$line1 =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@in1 = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line1 =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
#3番目の項目に全角文字があるものとする
$temp = $in1[2];
#記号・英数字・カタカタをすべて半角文字に変換する
$in1[2] = Unicode::Japanese->new($temp)->z2h->get;
#記号のみを半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hSym->get;
#数字のみを半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hNum->get;
#英字のみを半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hAlpha->get;
#カタカタのみを半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hKana->get;
#カタカタ(濁音つき、半濁音つきを除く)を半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hKanaK->get;
#カタカタ(濁音つき、半濁音つきのみ)を半角文字に変換する
# $in1[2] = Unicode::Japanese->new($temp)->z2hKanaD->get;
$out1 = join("\t",@in1);
print OUT1 "$out1\n";
}
close(IN1);
close(OUT1);
スクリプトはこちらにあります(必ずutf8で保存してください)。
入力データはこちらにあります(必ずutf8で保存してください)。
"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 []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ
0210 DEF []@!#$%&'()*+,-./
0220 DEF 0123456789
0230 DEF ABCEFGabcefg
0240 DEF アイウエオガザダバパヴ
0250 DEF カガ タダヒコ
0260 DEF スズキ ココロ
0270 DEF ジョン・スミス