前回の「住所から郵便番号を検索する」を更に応用してみる。郵便番号を検索するついでに、住所を「都道府県」「市区町村」「町域(地名)」で区切ってしまおう。
やることはあんまり変わらないので、説明はなし。今回も、ExcelAPIを使わせてもらう。
let
url1 = "https://api.excelapi.org/post/zipcode?address=",
url2 = "https://api.excelapi.org/post/address?zipcode=",
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
型の変更 = Table.TransformColumnTypes(ソース, {{"住所", type text}}),
郵便番号列の追加 = Table.AddColumn(
型の変更, "郵便番号",
each Web.Page(Web.Contents(url1&[住所]))
{0}[Data]{0}[Children]{1}[Children]{0}[Text],
type text
),
郵便番号列の編集 = Table.TransformColumns(郵便番号列の追加, {
"郵便番号",
each Number.ToText(Number.From(_), "000-0000"),
type text
}),
都道府県列の追加 = Table.AddColumn(
郵便番号列の編集, "都道府県",
each Web.Page(Web.Contents(url2&[郵便番号]&"&parts=1"))
{0}[Data]{0}[Children]{1}[Children]{0}[Text],
type text
),
市区町村列の追加 = Table.AddColumn(
郵便番号列の編集, "市区町村",
each Web.Page(Web.Contents(url2&[郵便番号]&"&parts=2"))
{0}[Data]{0}[Children]{1}[Children]{0}[Text],
type text
),
町域列の追加 = Table.AddColumn(
市区町村列の追加, "町域",
each Web.Page(Web.Contents(url2&[郵便番号]&"&parts=3"))
{0}[Data]{0}[Children]{1}[Children]{0}[Text],
type text
)
in
町域列の追加
こんな感じ。まず郵便番号を検索して、それを使って「都道府県」「市区町村」「町域(地名)」を検索している。
ただこの方法だと郵便番号の検索に失敗すると、そこで検索が途切れてしまう。
let
url = "https://api.nipponsoft.co.jp/zipcode/?search=",
SSTBCT = Splitter.SplitTextByCharacterTransition,
見出しリスト = {"都道府県", "市区町村", "町域"},
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
型の変更1 = Table.TransformColumnTypes(ソース, {{"住所", type text}}),
キーワード列の追加 = Table.AddColumn(型の変更1, "キーワード", each
SSTBCT(each true, {"0".."9"})([住所]){0},
type text
),
検索結果列の追加 = Table.AddColumn(
キーワード列の追加, "検索結果", each
Web.Page(Web.Contents(url&[キーワード])){0}[Data]{0},
type record
),
キーワード列の削除 = Table.RemoveColumns(
検索結果列の追加,{"キーワード"}
),
郵便番号列の追加 = Table.AddColumn(
キーワード列の削除, "郵便番号", each [検索結果][郵便番号], type text
),
列の並べ替え = Table.ReorderColumns(
郵便番号列の追加,{"住所", "郵便番号", "検索結果"}
),
検索結果列の編集 = Table.TransformColumns(
列の並べ替え, {"検索結果", each [
リスト変換 = List.Skip(Record.ToList(_)),
リスト編集 = List.Transform(リスト変換, each [
文字列反転 = Text.Reverse(_),
カナ = {"ァ".."ヶ", "ー", "0".."9"},
文字列区切り = SSTBCT(
カナ, each not List.Contains(カナ, _)
)(文字列反転),
文字列結合 = Text.Reverse(
Text.Combine(List.Skip(文字列区切り))
)
][文字列結合]),
レコード変換 = Record.FromList(
List.FirstN(リスト編集, 3), 見出しリスト
)
][レコード変換]
}),
検索結果列の展開 = Table.ExpandRecordColumn(
検索結果列の編集, "検索結果", 見出しリスト
),
型の変更2 = Table.TransformColumnTypes(
検索結果列の展開, List.Transform(見出しリスト, each {_, type text})
),
町域列の編集 = Table.TransformColumns( 型の変更2, {
"町域",
each Text.Start(_, Text.PositionOf(_&"(", "("))
})
in
町域列の編集
少しごちゃごちゃするけど、キーワード検索だから失敗は少ないかも。どっちにしても重いけど。