Power Query проверяет, содержит ли строка строки из списка - PullRequest
0 голосов
/ 07 ноября 2018

Есть ли способ проверить текстовое поле, чтобы увидеть, содержит ли оно какие-либо строки из списка?

Пример проверяемых строк:

The raisin is green
The pear is red
The apple is yellow

Пример списка для проверки против

red
blue
green

Результат будет

либо:

green
red
null

или

TRUE
TRUE
FALSE

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

У Даниэля есть приличное решение, но оно не будет работать, если строки примера не разделены пробелом. Например, The brick is reddish обнаружит red в качестве подстроки.

Вместо этого вы можете создать пользовательский столбец с этой формулой:

(C) => List.AnyTrue(List.Transform(Words, each Text.Contains(C[Texts], _)))

Принимает список Words = {"red","blue","green"} и проверяет, содержится ли каждый из цветов в списке в столбце [Texts] для этой строки. Если они есть, то возвращается TRUE, в противном случае FALSE.

Весь запрос выглядит так:

let
    TextList = {"The raisin is green","The pear is red","The apple is yellow"},
    Texts = Table.FromList(TextList, Splitter.SplitByNothing(), {"Texts"}, null, ExtraValues.Error),
    Words = {"red","blue","green"},
    #"Added Custom" = Table.AddColumn(Texts, "Check", (C) => List.AnyTrue(List.Transform(Words, each Text.Contains(C[Texts], _))))
in
    #"Added Custom"
0 голосов
/ 08 ноября 2018

Это сделает трюк, это код PowerQuery ("M"):

let
    Texts = {"The raisin is green","The pear is red","The apple is yellow"},
    Words = {"red","blue","green"},
    TextsLists = List.Transform(Texts, each Text.Split(_," ")),
    Output = List.Transform(TextsLists, each List.Count(List.Intersect({_,Words}))>0)
in
    Output

Есть два списка: предложения (тексты) и слова для проверки (слова).Первое, что нужно сделать, - это преобразовать предложения в списки слов, разделяющих строки, используя «» в качестве разделителя.

TextsLists = List.Transform(Texts, each Text.Split(_," ")),

Затем вы «скрещиваете» новые списки со списком слов.Результатом являются списки элементов (строк), которые появляются в обоих списках (TextLists и Words).Теперь вы подсчитываете эти новые списки и проверяете, является ли результат больше, чем cero.

Output = List.Transform(TextsLists, each List.Count(List.Intersect({_,Words}))>0)

Выход представляет собой новый список {True, True, False).

Кроме того, вы можете изменитьВыведите следующую строку:

Output = List.Transform(TextsLists, each List.Intersect({_,Words}){0}?)

Это вернет список первого совпадения или ноль, если совпадения нет.В примере: {"зеленый", "красный", "ноль"}

Надеюсь, это вам поможет.

...