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

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

Power Query:置換リストを使って文字列を一括で置き換える

置換リストを使ってデータを置き換えする場合、方法としては色々考えらえるけどリストから変換するのがいいかと思う。

画像のようなテーブルがある場合、ひとまず「氏名テーブル」と「置換テーブル」は読み込み済みとして、[ホーム]→[詳細エディタ]に下記を記述。

List.Generateを使った場合
    置換リスト = Table.ToRows(置換テーブル),
    値の置換 = Table.AddColumn(
        氏名テーブル, "変換後", each
        List.Reverse(List.Generate(
            ()=> [i=0, name=[氏名]],
            each [i] <= List.Count(置換リスト),
            each [
                i = [i]+1,
                リスト = 置換リスト{[i]},
                前 = リスト{0},
                後 = リスト{1},
                name = Text.Replace([name], 前, 後)
            ],
            each [name]
        )){0}, type text
    )
List.Accumulateを使った場合
    置換リスト = Table.ToRows(置換テーブル),
    置換後列の追加 = Table.AddColumn(
        氏名テーブル, "置換後", each
        List.Accumulate(
            置換リスト, [氏名],
            (state, current)=>
                Text.Replace(state, current{0}, current{1})
        ), type text
    )

速さは特に変わらないっぽい。わざわざ書いたけど、List.Accumulateでやるのが基本かなとは思う。

そしてここまで書いといてなんだけど、Microsoft365なら数式でやるのも一つの手ではある。

Microsoft365は便利だね
=REDUCE(
    [@氏名],
    SEQUENCE(ROWS(置換リスト)),
    LAMBDA(
        x,
        y,
        SUBSTITUTE(
            x,
            INDEX(置換リスト[前],y),
            INDEX(置換リスト[後],y)
        )
    )
)

便利な時代になったもんだ。