MyTetra Share
Делитесь знаниями!
Power Query. Формулы М. Множественная текстовая замена c List.Generate
Время создания: 07.10.2021 20:18
Текстовые метки: Power Query
Раздел: Разные закладки - MSO - Excel - Power Query
Запись: xintrea/mytetra_db_adgaver_new/master/base/1633627087tdt5s3smkb/text.html на raw.githubusercontent.com

Описание

В текстовой строке встречаются символы, слова и словосочетания, которые нужно заменить на другие, т. е. выполнить множественную замену подстроки.

Например, «Общество с ограниченной ответственностью» нужно заменить на «ООО», «Акционерное общество» на «АО» и т. д.

Решение

Для решения задачи предварительно нужно создать 2 вспомогательных таблицы.

Первая таблица содержит перечень всех замен. Вторая таблица содержит перечень аббревиатур. Вторая таблица нужна, чтобы привести аббревиатуры к нормальному виду после первой обработки.

После импорта источника и обеих вспомогательных таблиц нужно с помощью функции List.Generate создать цикл, который в каждом значении исходного столбца будет искать каждую подстроку для замены и выполнять замены, если она встретилась.

Примененные функции

Перечень всех примененных функций:

  • Text.Proper
  • List.Last
  • List.Generate
  • Text.Lower
  • List.Count
  • Text.Replace
  • Table.Buffer
  • Excel.CurrentWorkbook
  • Table.SelectColumns
  • Table.TransformColumns

Код

Код первой пользовательской функции преобразования:

(col)=>

let

    source = Text.Proper(List.Last(List.Generate(()=> [index=0, txt=Text.Lower(col)],

                                                 each [index]<=List.Count(Замена_1[Найти]),

                                                 each [index=[index]+1,

                                                       txt=Text.Replace([txt],

                                                                        Замена_1[Найти]{[index]},

                                                                        Замена_1[Заменить]{[index]})],

                                                 each [txt])

                                                 ))

in

    source

Код второй пользовательской функции преобразования:

(col)=>

let

    source = List.Last(List.Generate(()=> [index=0, txt=col],

                                     each [index]<=List.Count(Замена_2[Найти]),

                                     each [index=[index]+1,

                                           txt=Text.Replace([txt],

                                                            Замена_2[Найти]{[index]},

                                                            Замена_2[Заменить]{[index]})],

                                     each [txt])

                                     )

in

    source

Код запроса с решением:

let

    source = Excel.CurrentWorkbook(){[Name="Гостиницы"]}[Content],

 

    select_cols = Table.SelectColumns(source,

                                      {"Компания"}),

 

    transform_col_1 = Table.TransformColumns(select_cols,

                                             {{"Компания",

                                              ф_Замена_1,

                                              type text}}),

 

    transform_col_2 = Table.TransformColumns(transform_col_1,

                                             {{"Компания",

                                              ф_Замена_2,

                                              type text}})

 

in

 

    transform_col_2


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования