Power Query - условный столбец с несколькими критериями ввода - PullRequest
1 голос
/ 14 октября 2019

Я хотел бы попросить вас помочь с проблемой, связанной с мощным запросом, которую я не могу решить самостоятельно:

Один из столбцов [адрес] содержит такие данные:

    Science Park 404, 1098 XH Amsterdam, Netherlands
    Laan van Malkenschoten 20, 7333 NP Apeldoorn, NL
    plac Europejski 1, 00-844 Warszawa, Poland
    Adrianastraat 6, 3014 XL Rotterdam, Netherlands
    C. Co Brava, 109, 17411 Vidreres, Girona, Spain

У меня также есть список ключевых слов, которые содержат: Амстердам, Апелдорн, Роттердам

Мне нужно, чтобы силовой запрос проверял, содержит ли столбец [адрес] какое-либо из ключевых слов, и если да,в новом настраиваемом столбце отобразится «MATCH»:

    Science Park 404, 1098 XH Amsterdam, Netherlands MATCH
    Laan van Malkenschoten 20, 7333 NP Apeldoorn, NL MATCH
    plac Europejski 1, 00-844 Warszawa, Poland
    Adrianastraat 6, 3014 XL Rotterdam, Netherlands  MATCH
    C. Co Brava, 109, 17411 Vidreres, Girona, Spain

Список ключевых слов хранится в том же файле Excel, в таблице из одного столбца под названием «CITIES_NL»

Теоретически я могу создать условный столбец и жестко закодировать ключевые слова, однако я не могу сделать это по двум причинам:

  • список должен быть динамичным, вероятно, будут добавлены новые ключевые словаежедневно
  • в производстве список ключевых слов будет состоять из 75 тыс. элементов, его невозможно ввести в PQ

. Чтобы добиться того же в Excel, без PQ,Я бы использовал эту формулу:

    =IF(--SUMPRODUCT(--ISNUMBER(SEARCH(CITIES_NL,address)))>0,"MATCH","")

однако, это должно сделать PQ, поскольку это только один из этапов подготовки моих данных

Буду признателен за вашу помощь!

Михал

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Во-первых, добавьте обе таблицы ADDRESS и CITIES_NL в редактор мощных запросов, преобразуйте CITIES_NL в Список , затем добавьте пользовательский столбец в таблицу ADDRESS, используя следующую формулу:

=if List.Count(Splitter.SplitTextByAnyDelimiter(CITIES_NL)([Column1]))>1 then "MATCH" else null

Логика состоит в том, чтобы разделить ADDRESS на любые слова, содержащиеся в списке CITIES_NL, и подсчитать, сколько там подстрок. Если результат больше 1, что означает, что было найдено хотя бы одно ключевое слово, используйте IF для возврата MATCH в противном случае (null).

Заменить [Column1] с фактическим именем столбца в вашем случае.

Вот полный код Power Query M для вашей справки:

let
    Source = Excel.CurrentWorkbook(){[Name="ADDRESS"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if List.Count(Splitter.SplitTextByAnyDelimiter(CITIES_NL)([Column1]))>1 then "MATCH" else "")
in
    #"Added Custom"

Обратите внимание, что совпадение будет чувствительным к регистру. Если требуется сопоставление без учета регистра, можно добавить столбец индекса в таблицу ADDRESS, создать дубликат запроса ADDRESS, преобразовать значения ADDRESS и CITIES_NL в нижний регистр, затем выполнить сопоставление, а затемобъединить сопоставленный запрос с исходным запросом ADDRESS по порядковому номеру.

Дайте мне знать, если у вас есть какие-либо вопросы. Ура :) 1036 *

1 голос
/ 14 октября 2019

Вы можете сделать это динамически, добавив пользовательский столбец, который для каждого адреса проверяет каждое ключевое слово, чтобы увидеть, является ли оно подстрокой, и подсчитывает количество ключевых слов, которые являются подстрокой адреса. Если count > 0, тогда вернуть "MATCH".

Вот один из способов сделать это:

= Table.AddColumn(#"Previous Step Reference", "Custom Column Name",
      (C) => if List.Count(
                    List.Select(CITIES_NL[keyword], each Text.Contains(C[address], _))
                ) > 0
             then "MATCH"
             else null,
      type text)

Синтаксис немного другой, но логика очень похожа на формулу Excel.

Обратите внимание, что я определил контекст C, чтобы я мог ссылаться на address из этого контекста строки в контексте списка CITIES_NL[keyword].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...