はじめのはじめに
本文はすべて我が配下、ChatGPTに出力させたものです。検証も面倒でメモ程度に出力したものですので眉唾で見てください。
はじめに
Power BI(Power Query)を使っていると、URLエンコードされている文字列を「元の人が読める文字列」に戻したくなることがあります。例えば redirect_to=https%3A%2F%2Fexample.com%2F
のようなパラメータがクエリ内に混在している場合などです。
通常、.NET系なら Uri.UnescapeDataString()
を使ってデコードできますが、PowerQuery(M言語)環境だと Uri.UnescapeDataString
が使えない 場合があります。そこで活躍するのが、Uri.Parts
を使った「ダミーURLへ埋め込み → クエリ部分を引っこ抜く」テクニックです。
やりたいこと
"https%3A%2F%2Fexample.com%2F?utm_source%3Dxxx"
↓
"https://example.com/?utm_source=xxx"
のように、URLエンコード文字列を元に戻します。
使うもの:Uri.Parts
Power Queryには、Uri.Parts()
という「URLを構成要素に分解する関数」が用意されています。
この関数で返される結果はレコード型で、以下のようなキーを持っています。
-
Scheme
(例: "https") -
Host
(例: "example.com") -
Port
(例: null) -
Path
(例: "/path/to/something") -
Query
(例: [ q = "実際のクエリ文字列" ]) -
Fragment
(例: null) - ...など
たとえば「クエリパラメータの中に文字列を埋め込んで Uri.Parts
に食わせる」ことで、半自動的にエンコードを解除してくれます。
サンプルMコード
let
// 例)エンコード済みの文字列をDataというテーブルで持っているとする
Source = Table.FromRecords({
[ id = 1, EncodedUrl = "https%3A%2F%2Fexample.com%2F?utm_source%3Dxxx" ],
[ id = 2, EncodedUrl = "https%3A%2F%2Fexample.org%2Fpath%3Fparam%3Dtest" ]
}),
// 1) ダミーURLへ埋め込み
// ※ "https://dummy.com/?q=" + [EncodedUrl] の形式
// 2) Uri.Parts で分解
// 3) 取得した Query の "q" を取り出す
Decoded = Table.AddColumn(
Source,
"DecodedUrl",
each Uri.Parts("https://dummy.com/?q=" & [EncodedUrl])[Query][q]
)
in
Decoded
このようにすれば、DecodedUrl
列には
https://example.com/?utm_source=xxx
のようにURLデコードされた結果が入ります。あとは Text.BetweenDelimiters
や Text.Split
などを使って、パラメータ解析を進めるだけです。
仕組み
ダミーURLにパラメータをくっつけて Uri.Parts
に丸投げすると、Uri.Parts
が内部的にURLデコードをしながら構造を分析してくれます。その結果、Query
に含まれるデータがデコード後の文字列として取得できるというわけです。
Power BIの環境で直接 Uri.UnescapeDataString
が使えない場合は、この「ダミーURLにエンコード文字列を埋め込んで Uri.Parts
」 というやり方をぜひ活用してみてください。
まとめ
- PowerQuery/M言語では
Uri.UnescapeDataString
が機能せず困る場合がある - 代わりに
Uri.Parts("https://dummy.com/?q=" & [EncodedUrl])[Query][q]
でデコードできる - これでエンコードされたURLを簡単にデコードし、解析や加工が可能になる
Power BI での ETL 処理を効率よく進めるうえで、覚えておくときっと役に立つはずです。