2018年9月8日

小ネタ:Powershellで半角カタカナを全角カタカナに変換

前置き


データクレンジングとして、英数字は全角を半角にしつつ、半角カタカナは全角カタカナにしたいということは往々にしてあるかと思います。
それをPowershellで実施する手順のご紹介です。ネタ元は、以下のページ2つの合わせ技です。
半角→全角、全角→半角の数値変換スクリプト
半角カナを全角カナに変換する

変換コード


# 初期化
[reflection.assembly]::LoadWithPartialName("Microsoft.VisualBasic") > $Null
$Narrow = [Microsoft.VisualBasic.VbStrConv]::Narrow
$Wide = [Microsoft.VisualBasic.VbStrConv]::Wide

function Convert-Wide2Narrow() { # Start Convert-Wide2Narrow()
    Param([string]$Text) # 変換元テキストを引数に指定

    $CT = "" ; $Kana = "" # 変換後テキスト、一時キャッシュ変数初期化
    $NT = [Microsoft.VisualBasic.Strings]::StrConv($Text, $Narrow) # 全角を一括で半角に
    # 半角カタカナだけ全角へ変換
    ForEach ( $i in @(0..$NT.length) ) { # string[]からcharを取り出す
        if ($NT[$i] -match "[\uFF61-\uFF9F+]") { # 半角カタカナ処理
            $Kana = $Kana + $NT[$i] # キャッシュ格納(濁点、半濁点対応)
        } else {
            $Kana = [Microsoft.VisualBasic.Strings]::StrConv($Kana, $Wide) # 半角カタカナを全角に
            $CT = $CT + $Kana + $NT[$i]
            $Kana = ""
        }
    }
    return $CT

} # End Convert-Wide2Narrow()

# ここから変換確認。

$OT = @"
元のテキストに以下の内容が含まれている。
全角英数字:ABCabc123$‘@
半角英数字:ABCabc123$'@
全角カタカナ:アイウエオ、ガギグゲゴ、パピプペポ
半角カタカナ:アイウエオ、ガギグゲゴ、パピプペポ
"@

$OT
[Microsoft.VisualBasic.Strings]::StrConv($OT, $Wide) # すべて全角に変換
[Microsoft.VisualBasic.Strings]::StrConv($OT, $Narrow) # すべて半角に変換
Convert-Wide2Narrow -Text $OT # 英数字を全角から半角にし、半角カタカナは全角に変換
「半角カタカナだけ全角へ変換」のForEach処理だけ切り出せば半角カタカナから全角カタカナへの変換が実現します。
Function全体では英数字の半角化も行っておりデータクレンジングでよくある手法になっています。

なお、ForEachで添字の$iを$NT.lengthにしている($NT.length -1 ではない)ので、最終文字が半角カタカナだった場合でも$CTの結合処理に行くことを実行確認してます。
ですが、バージョンによって挙動が変わる可能性もありますので、最終文字だけ変換されない場合にはReturnする前にElse内の全角化+文字列結合処理を付け加えてください。

また、初期化処理をFunction内に組み込みたい人のために[reflection.assembly]の処理を>$Nullしてます。(出力があるので、Returnに混入する)
大量のテキストを変換させるなら素直にGlobalしたほうが処理は早いと思ったので上記では外出ししてます。

あと、試験結果でわかるように、全角から半角に変換する際にシングルクォートの開始記号がただのシングルクォートになります。そりゃそうですね。
ただ、全角にした際に文字コードFA56のシングルクォートになります。期待値は8166じゃないですかね。この辺はMicrosoftのセンスを疑わざるを得ません。
そんな訳で、過信は禁物です。

0 件のコメント:

コメントを投稿

TIPS:VSCodeで日本語化がうまくいかないとき

前置き Visual Studio Codeで拡張機能「 Japanese Language Pack for Visual Studio Code 」を入れたら日本語になりますよね。 でも、「 Remote Development 」で色々な環境を日本語化してると、偶に...