Power Query 実務テンプレ | クレンジング(前処理)系:全角→半角変換

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Power Query で“全角の英数字・カナ・記号などを半角にそろえる”実務テンプレ」を身につけることです。
目的はシンプルで、「見た目は同じなのに、全角と半角が混ざっていて一致しない問題」を潰すことです。

例えば「A123」と「A123」、「タロウ」と「タロウ」、「(株)」と「(株)」が混在していると、JOIN・集計・重複チェックが全部ズレます。
ここを「とりあえず半角にそろえる」という一手を、前処理としてテンプレ化しておきます。


まずは「どこで全角→半角が必要になるか」をイメージする

ありがちな“全角・半角まじりトラブル”

実務でよくあるのは、こんなパターンです。

顧客コード:"A123""A123" が混在している。
電話番号:"03-1234-5678""03-1234-5678" が混在している。
カナ氏名:"タロウ""タロウ" が混在している。

見た目は「同じっぽい」のに、文字としては別物なので、
結合キーに使うと一部だけ結合されない、重複チェックで別レコード扱いになる、などの事故が起きます。

ここで「全角→半角変換」を一発かけておくと、
「A123」「03-1234-5678」「タロウ」のように、少なくとも“同じ文字列”として扱えるようになります。


基本方針:自作関数で「全角→半角」を定義する

Power Query には「全角→半角」の標準関数がない

まず押さえておきたいのは、M 言語(Power Query)には
「全角を半角に変換する専用の標準関数」は用意されていない、ということです。

なので、実務では次のどちらかの方針を取ります。

自分で「全角→半角の置換マップ」を作って、Text.Replace を組み合わせる。
必要な文字種(英数字だけ、カナだけ、記号だけ)に絞って、シンプルな変換関数を自作する。

ここでは「実務でよく使う英数字+記号」を例に、
初心者でも読めるレベルの“自作変換関数”をベースに話を進めます。


例題1:1列に対して全角→半角をかけるテンプレ

シンプルな変換関数を作る

まずは、「顧客コード」列だけに全角→半角をかけるイメージで、
最小限の変換関数を作ってみます。

// クエリ名:fn_ZenkakuToHankaku
let
    ZenkakuToHankaku = (text as text) as text =>
        let
            // 1) 変換元と変換先の文字列を用意
            From = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-()",
            To   = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-()",

            // 2) 1文字ずつ置換していく
            Result =
                List.Accumulate(
                    {0..Text.Length(From) - 1},
                    text,
                    (state, i) =>
                        Text.Replace(
                            state,
                            Text.Middle(From, i, 1),
                            Text.Middle(To,   i, 1)
                        )
                )
        in
            Result
in
    ZenkakuToHankaku
Power Query

やっていることを言葉で整理すると、こうです。

From に「全角の文字列」を並べる。
To に「対応する半角の文字列」を同じ順番で並べる。
0 文字目、1 文字目…と順番に見ていき、「From の i 文字目」を「To の i 文字目」に置き換えていく。

例えば、From の先頭は "0"、To の先頭は "0" なので、
"0""0" に置換する、という処理が最初に走ります。

この関数を一度作っておけば、他のクエリから fn_ZenkakuToHankaku([顧客コード]) のように呼び出せます。

顧客コード列にだけ適用する例

顧客コード列だけを変換するなら、こんな感じです。

let
    Source = ・・・前のステップ・・・,

    Converted =
        Table.TransformColumns(
            Source,
            {
                {"顧客コード", fn_ZenkakuToHankaku, type text}
            }
        )
in
    Converted
Power Query

これで、「顧客コード」列の中にある全角英数字・全角記号(From に書いた分だけ)が、
対応する半角に変換されます。


例題2:全ての文字列列に一括で全角→半角をかける

「列が多い」「どこに全角が紛れているか分からない」ケース

実務では、「顧客コードだけ」では済まないことが多いです。
店舗コード、電話番号、郵便番号、カナ氏名、メールアドレスなど、
とにかく文字列列は全部半角に寄せておきたい、というニーズがよくあります。

その場合は、「文字列型の列を自動で拾って、全部に fn_ZenkakuToHankaku をかける」というテンプレが便利です。

文字列列を自動判定して一括変換するコード

let
    Source = ・・・前のステップ・・・,

    // 1) 文字列型の列名だけを取得
    TextColumns =
        List.Select(
            Table.ColumnNames(Source),
            (colName) =>
                Value.Type(Source[colName]) = type text
        ),

    // 2) 変換指示リストを作成
    TransformList =
        List.Transform(
            TextColumns,
            (colName) => {colName, fn_ZenkakuToHankaku, type text}
        ),

    // 3) 全ての文字列列に全角→半角を適用
    Converted =
        Table.TransformColumns(
            Source,
            TransformList
        )
in
    Converted
Power Query

ここでの重要ポイントは二つです。

TextColumns で「型が text の列名だけ」を自動で拾っていること。
TransformList で「その列に fn_ZenkakuToHankaku をかける」という指示をまとめて作っていること。

これをクレンジングの早い段階に一発入れておけば、
「どの列に全角が紛れていても、とりあえず半角に寄せる」という状態を作れます。


重要ポイントの深掘り

変換対象の文字をどう決めるか

fn_ZenkakuToHankaku の From / To に何を書くかは、完全に“業務次第”です。

英数字だけで十分な現場もあれば、
カタカナ(全角カナ → 半角カナ)も変換したい現場もあります。

例えば、カタカナも含めたいなら、From / To にカナを追加していきます。

From に "アイウエオカキクケコ..."(全角カナ)
To に "アイウエオカキクケコ..."(半角カナ)

というように、「1文字ずつ対応」を増やしていけばOKです。

最初から全部を完璧にやろうとするとしんどいので、
まずは「英数字+よく使う記号」から始めて、必要になったらカナを足す、くらいのノリで十分です。

全角→半角にするタイミング

全角→半角変換は、基本的に「型が text のうちにやる」のが鉄則です。

数値型に変換したあとでは、そもそも "0" という文字は残っていません。
逆に、変換前に数値型にしてしまうと、「全角数字が原因で変換エラー」になることもあります。

おすすめの順番はこうです。

元データを取り込む。
必要な列を text 型にそろえる。
全角→半角変換をかける。
そのあとで、必要な列を number / date などに変換する。

この順番を守ると、「全角数字が混じっていても、ちゃんと半角にしてから数値化できる」ようになります。


実務テンプレとしてのまとめ

「全角→半角変換」の本質は、たった一言です。

「自分で“全角→半角の対応表”を作り、それを文字列列に一括で適用する」

これをクレンジングのテンプレとして持っておくと、
顧客コード・店舗コード・電話番号・カナ氏名など、
“全角・半角まじり問題”で悩む時間をかなり減らせます。

タイトルとURLをコピーしました