■Windows版Rubyの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Rubyの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
      6. [3-6.半角全角変換]
        1. [3-6-1.半角英数字を全角英数字に変換する(jcodeライブラリ利用)]
        2. [3-6-2.半角カタカナを全角カタカナに変換する(nkfライブラリ利用)]
        3. [3-6-3.全角の英数字・記号を半角の英数字・記号に変換する(nkfライブラリ利用)]
        4. [3-6-4.全角文字と半角文字を相互に変換する]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

3.応用編

3-6.半角全角変換

3-6-4.全角文字と半角文字を相互に変換する

自分でクラスを定義して半角文字と全角文字との間の変換を行う方法です。スクリプトの中で全角文字を使いますので、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 ジョン・スミス  
    



Copyright (c) 2011-2015 Mitsuo Minagawa, All rights reserved.