여러 단어를 함께 대체

기본 함수는 하나의 단어를 대체하는 Text.Replace() 만 찾는 것으로 보이므로 여러 단어를 모두 지우거나 대체하는 코드를 작성해 보았습니다.
2019/9/14 추가: 패턴 2에 더 짧은 버전을 추가했습니다.

샘플 데이터



상세 편집기에 붙여보세요.

샘플 텍스트
let
    Source = "H4sIAAAAAAAEAK2Wz09jVRTH9/xVFjOJrkxYaVyYTGbhwsRMDLp+p0anQEtLB5mNsfPSIC0Q6DQF+VEIpHR40hJHCYbYcXDMQAFJSnRhRhd+znnvta/VGBemeX333XvuOd/zPT/ulR+lIBUnJuE7JxdSl5JcicfXnKyIK2W5YW5ODlnVcZF3W1pSkaozzNsVT7b7pJupETlm/XAsh952oCvc30z/Isfp3zK/yhpfVVkUL/mBzIcah5xXFEb2Zd+mohNjW0M2mNljZU12eOp9ajooqAGhJatSV/nJnzF/7sQyL1C/n01K8d6l7DqxIWc0/m48Gx+NJ+Ij8dvxEScWf1PfNh4e+rdF50MFWJ9ZkH2YuJTazL0o9lEwP9cHjCWWm/JUHkGfWt9ipg5lPaKO8WgOieeybCQ9ZgcPo7xsy3HqcznFz9p4DD9mA9JfSD5EEeGULRuSn9hCsWvIcDv5AEoKjJ9JDfOd1BlArlBdR40hVloTWajDSKqNZB3z6g2UGtCufrSXlHj1MIf4NsifYuorM11g7pyvTShAbnA5x68VLoeyveUzWTIaS+KqQCjtC3gmsBMRUPoTjZ6bAO/gSrUXBuJPGuNyk5nq/xLvKK8RXhqZN+SYXBjIgz7mPHDrUwn3AyfjQHqkvLI36ffkO3xoy950UflIvybfD8a7TnxhwolpNOUbYumS4ss6o4UwPWc4d2yThzKluTH1iXjZPxUhyGctNr4P4ahgyVVjxpKOZGtHanHm7ek/ULavhsnTHa2sgVKnxrTYpXP/o+lEkK9+wPrKImCEvHxoAlU58x0bDeqlq9XGBcY32C1r0DPfmn03SFs2Mp+jso1HSCj2ZC1UpyRgB4PL1g20CwSmNqwotYMVUURMneFEldI8sApqdDcrk3nezZD8Ep/9SdDlQK5hYAV7XzNDkYDHw0Qx0iZRPXY02AgnDqZetwApg2U8nJeGhnbyjhYzOoLQwGTNL70TM/0I8cBdYNmWaIq4Ud5P+OW7zcj+gfOYkRotmZ5ei+rcjwehm1cFPmXq9awTiy5BzF5AY9Askg+zL+nQe5O3BqRWe2FGCdY8a+V9gkaQ4nOpdX2eUfmaVG6U/Qjj5mUQCWCf8uvMbNIJPGyuWapXUUKvx34xGO37rbB3QhD2CjFbUkjWLX7QWvTjkb2RXfHGPvYLx0/SBflJk6476h4Gt4xxTZij9Drx06IM86RAdri+M+kj/yybKI+/ipOLkP5k8v2wGQ8eH62ehZ7np30ZpF9PoHGROFSsMWgf6bYAxTLzJUzUohZa1l/Vj2uWtJy29RzgMHJlHcb1GMrrfYAz4e74F3poovTEohHz32EnYlS1atnyD1piSYNIvwO4Fu6Tm6m7lEWZaNLSEuuW5FW9L7CqAXT/i4d5YlBhg7U+zYTgmItcGOx0Yss1mGoRZUWZy06B4Bp8qzDb372L3Ht2wdxh/xWFduFLcF0os2PBv1CQrX7YOtO/y3zYbzXUpnnXArzWf/RgnQuHtP3EyWt9RMszSI1AbxO9rnF5ET1Z7FhrygHsLv1jgtC2rElZNlnjguwtPeD/Tmp94K7gkwihY+fSmSgkP6UH5MyPAJse8/Hb/ultb1SallOQXPntafJwMAgVu2gEHS29wuKlVA1V2E73zLimhZdNZrYevOWvfLZpVPYc/QvHXnlEmgoAAA==",
    Custom1 = Binary.Decompress( Binary.FromText(Source),Compression.GZip),
    Custom2 = Text.FromBinary(Custom1,932)
in
    Custom2



패턴 1 : 지정한 어구를 전부 말소하고 싶다.



지우려는 텍스트 목록



지우기 목록
let
    Source = "WyJcdTY4NDNcdTU5MmFcdTkwY2UiLCJcdTMwNGFcdTMwNThcdTMwNDRcdTMwNTVcdTMwOTMiLCJcdTMwNGFcdTMwNzBcdTMwNDJcdTMwNTVcdTMwOTMiLCJcdTY4NDMiXQ==",
    Custom1 = Binary.FromText(Source),
    #"Imported JSON" = Json.Document(Custom1,932)
in
    #"Imported JSON"



코드


= List.Accumulate(消去リスト,
                  サンプルテキスト,
          (state,current)=>Text.Replace(state,current,"")
 )

완성도



목표대로 주어가 등장 인물이 사라지고 있습니다.


패턴 2 : 지정된 표와 같이 대체하고 싶습니다.



미리 변환표의 형태로 준비해 두고 나서, 그에 따라, 변환합니다.

단어 변환 표



t_ 지시 테이블
let
    Source = "H4sIAAAAAAAEAI2QOw6AIBAF70JtgSxfryIWuMINqIx3dxcrDRqbyf7ekDDvIlazlhyrRzuKiVrrNdAwqBRrkJjFQENXLN1Y2FZaFY/tEuSmmQWZON5Sx9Bxg9SJaXyrW9oYZoD3d5yC9O1zstXqn++Z6rv5H74cWV0Ux3IClZSxMUcBAAA=",
    Custom1 = Binary.Decompress(Binary.FromText(Source),Compression.GZip),
    #"Imported JSON" = Table.FromRecords(Json.Document(Custom1,932))
in
    #"Imported JSON"



코드(구)



나중에 꺼내기 쉽도록, 한 번 함수(fx_복수 치환)를 마무리하고 나서, 실행시키고 있습니다.

q_복수 치환
[fx_複数置換=
 (対象 as text,指示表 as table,C1 as text,C2 as text)=>

    List.Last( List.Generate(()=>[id=0,vstr=対象],
                             each [id]<=Table.RowCount(指示表),
                             each [id=[id]+1,
                                   vstr=Text.Replace([vstr],
                                                  Record.Field(指示表{[id]},C1),
                                                  Record.Field(指示表{[id]},C2)
                                         )
                                  ],
                             each [vstr]
                )
    ),
 実行=fx_複数置換(サンプルテキスト,t_指示テーブル,"対象","置換後")
][実行]

코드(신규)



이전에 대회 에서 생각했을 때, 더 간단한 방법을 생각해 왔습니다만, 올리는 것을 잊었습니다.
단지, 이것뿐입니다.
※빈 쿼리를 만들어 수식 바에 붙여주세요.

q_복수 치환 Ver2
= List.Accumulate(
  Table.ToRows(t_指示テーブル), //リストの各項目を用いた繰り返し処理。
    サンプルテキスト,        //初項。最初のxはこれになる。
   (x,y)=>Text.Replace(x,y{0},y{1}) //{0},{1}はリストの項目の取り出し方の記法。
 )

Ver2 해설



모두가 좋아하는 List.Accumulate 함수를 사용했습니다.
첫 번째 인수의 목록의 처음부터 끝까지의 모든 항목을 사용하여 무언가를 할 때 사용합니다.
공식 설령에서는 state,current로 함수를 만들고 있습니다만, 요점은 순서와 이름을 틀리지 않으면 무엇이든 괜찮습니다.
※저는 x와 y라든지, a와 b로 하는 것이 많습니다. 일본어로, 「끝」과 「후」라도 좋다.

그림
Table.ToRows 함수의 결과 모습


List.Accumulate 함수의 진행 상황



x
y
처리 후 결과


첫번째
샘플 텍스트 내용
모모타로
(모모타로⇒피치타로 치환 후의 문자열)

두번째
첫 번째 처리 후 결과
할아버지
(게다가 할아버지 ⇒ 할아버지 교체 후의 문자열)

3번째
2번째 처리 후의 결과
할머니
(또한 할머니 ⇒ 할머니 교체 후 문자열)

4주차
3번째 처리 후의 결과
복숭아
(게다가 복숭아⇒모모 치환 후의 문자열)


공식 기사는 이쪽. (모두 영어)
List.Accumulate - PowerQuery M | Microsoft Docs
Expressions, values, and let expression 내의 리스트의 개소

List.Accumulate 함수를 본격적으로 사용하고 있다 @PowerBIxyz 님의 기사는 이쪽.
나도 이 기사를 쓰고 나서, 사용하기 시작했습니다.
Power Query의 List.Accumulate 함수는 무엇입니까 - Qiita

완성도



변환되고 있네요.


덤 : 패턴 1 별법



Splitter 함수군에 딱 좋은 것이 있기 때문에, 이쪽이 깨끗이 합니다.
다만, 나는 잊을 것 같다고 생각했으므로, Splitter를 별법으로 했습니다.
Text.Combine(
 Splitter.SplitTextByEachDelimiter(消去リスト)(サンプルテキスト)
)

참고: 레퍼런스
Splitter.SplitTextByEachDelimiter | Microsoft Docs

좋은 웹페이지 즐겨찾기