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

■ナビゲータ

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

  1. [Windows版Perlの細道・けもの道]
    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.半角カタカナを全角カタカナに変換する(JPerl.exe利用)]
        2. [3-6-2.半角カタカナを全角カタカナに変換する(Encodeモジュール利用)]
        3. [3-6-3.半角カタカナを全角カタカナに変換する(Jcodeモジュール利用)]
        4. [3-6-4.半角文字を全角文字に変換する(Unicodeモジュール利用)]
        5. [3-6-5.全角カタカナを半角カタカナに変換する(JPerl.exe利用)]
        6. [3-6-6.全角カタカナを半角カタカナに変換する(Encodeモジュール利用)]
        7. [3-6-7.全角カタカナを半角カタカナに変換する(Jcodeモジュール利用)]
        8. [3-6-8.全角文字を半角文字に変換する(Unicodeモジュール利用)]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

3.応用編

3-6.半角全角変換

3-6-8.全角文字を半角文字に変換する(Unicodeモジュール利用)

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 ジョン・スミス
    



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