自分でクラスを定義して半角文字と全角文字との間の変換を行う方法です。スクリプトの中で全角文字を使いますので、ruby1.8以前では、$KCODEに文字コードを指定し、ruby1.9以降では、マジックコメントをスクリプトの1行目に指定します。指定方法については、[2-1-5.スクリプトの中で漢字を使う]を参照してください。
なお、ruby1.8以前の場合、入力ファイル・スクリプト・$KCODEの指定はすべて一致させてください。
また、ruby1.9以降の場合、入力ファイル・スクリプト・マジックコメントの指定はすべて一致させてください。
以下の例では、入力ファイルの3番目の項目にある英数字とカタカナをすべて変換するようにしていますので、半角英数字とカタカナを全角英数字とカタカナに変換するため、「s_zenhan.h2z(in1[2]) 」としています。逆に全角英数字とカタカナを半角英数字とカタカナに変換する場合には、「h2z」を「z2h」とし、「s_zenhan.z2h(in1[2]) 」とします。
また、アルファベットのみ、数字のみ、カタカナのみを変換したい場合は、新たにメソッドを定義し、以下のようにします。
アルファベットのみの変換
def z2halpha(str)
convert(str, @@zen_alpha, @@han_alpha)
end
def h2zalpha(str)
convert(str, @@han_alpha, @@zen_alpha)
end
数字のみの変換
def z2hnumber(str)
convert(str, @@zen_number, @@han_number)
end
def h2znumber(str)
convert(str, @@han_number, @@zen_number)
end
カタカナのみの変換
def z2hkana(str)
convert(str, @@zen_kana, @@han_kana)
end
def h2zkana(str)
convert(str, @@han_kana, @@zen_kana)
end
実際に応用する場合は、入出力データのファイル名、入力ファイルのデータの項目(以下の例では入力データの3番目の項目を変換対象としています)等を変更して、利用します。
# coding:windows-31j
# zenhanconv.rb
# 内容 : 全角カタカナと全角数字、全角アルファベットをそれぞれ
# 半角カタカナと半角数字、半角アルファベットに変換する。
# (上記の逆変換も行う)
# 前提 : ruby1.9以上であること
# 入力ファイルとスクリプトは両方ともshift_jisとすること
# Copyright (c) 2011-2015 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>ruby zenhanconv.rb
#
# 入力ファイル
in1_file = open("input_sjis.txt","r:windows-31j")
# 出力ファイル
out1_file = open("output_sjis.txt","w:windows-31j")
class ZenHankakuConvert
@@zen_kana = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ
ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ
ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ
タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ
マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン
ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゛ ゜ ー ・ ).freeze
@@han_kana = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ
ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ
ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ
タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ
マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン
ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー ・ ).freeze
@@zen_number = %w(0 1 2 3 4 5 6 7 8 9 ).freeze
@@han_number = %w(0 1 2 3 4 5 6 7 8 9 ).freeze
@@zen_alpha = %w(a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z ).freeze
@@han_alpha = %w(a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z ).freeze
def z2h(str)
convert(str, @@zen_kana, @@han_kana)
convert(str, @@zen_number, @@han_number)
convert(str, @@zen_alpha, @@han_alpha)
end
def h2z(str)
convert(str, @@han_kana, @@zen_kana)
convert(str, @@han_number, @@zen_number)
convert(str, @@han_alpha, @@zen_alpha)
end
private
def convert(str, from, to)
from.each_with_index do |char, i|
str.gsub!(char, to[i])
end
return str
end
end
require 'nkf'
s_zenhan = ZenHankakuConvert.new
# 主処理
while (line1 = in1_file.gets)
line1.chomp!
#タブ区切りのとき
# in1 = line1.split("\t",-1)
#カンマ区切りのとき
in1 = (line1 + ',')
.scan(/"([^"\\]*(?:\\.[^"\\]*)*)",|([^,]*),/)
.collect{|x,y| y || x.gsub(/(.)/, '\1')}
# 全角から半角へ変換
in1[2] = s_zenhan.z2h(in1[2])
# 半角から全角へ変換
# in1[2] = s_zenhan.h2z(in1[2])
out1 = in1.join("\t")
out1_file.print out1,"\n"
end
# ファイルのクローズ
in1_file.close
out1_file.close
スクリプトはこちらにあります(必ず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 ジョン・スミス