ゴールのイメージをそろえる
今回のテーマは「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 などに変換する。
この順番を守ると、「全角数字が混じっていても、ちゃんと半角にしてから数値化できる」ようになります。
実務テンプレとしてのまとめ
「全角→半角変換」の本質は、たった一言です。
「自分で“全角→半角の対応表”を作り、それを文字列列に一括で適用する」
これをクレンジングのテンプレとして持っておくと、
顧客コード・店舗コード・電話番号・カナ氏名など、
“全角・半角まじり問題”で悩む時間をかなり減らせます。
