なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:住所を区切る

前回の「住所から郵便番号を検索する」を更に応用してみる。郵便番号を検索するついでに、住所を「都道府県」「市区町村」「町域(地名)」で区切ってしまおう。

やることはあんまり変わらないので、説明はなし。今回も、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
    町域列の編集

少しごちゃごちゃするけど、キーワード検索だから失敗は少ないかも。どっちにしても重いけど。