Найти строку из одного списка в другом списке и найти строку возврата

Я нашел часть того, что искал, в списках соответствий / таблицах в запросе мощности, но Мне нужно немного больше.

Используя пример «Только флаги», представленный в списках соответствий / таблицах в запросе мощности, я m сравнивая два списка, ListA и ListB, чтобы проверить, отображается ли содержимое строки ListB в содержимом строки ListA вообще. Я не могу выполнить однозначное сопоставление содержимого обеих строк (например, с List.Intersect), потому что содержимое строки в ListB может быть только частью содержимого строка в ListA.

Обратите внимание, что в запросе ниже ListB включает «roo», то есть первые три буквы в слове room. Я хотел бы знать, что «roo» находится в строке ListA, которая имеет «в моей комнате».

Пример «Только флаги», представленный списками соответствий / таблицами в запросе мощности, уже определяет, что « roo »- это часть строки ListA, в которой есть« в моей комнате ». Я построил этот пример, чтобы назначить «да» вместо истины, когда есть такое совпадение между ListA и ListB.

Что я хочу сделать, так это заменить «да» фактическим значением из ListB - например, значением «roo». Я попытался просто заменить слово B на «да», но у меня возникла ошибка, что слово B не распознается.

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "me", "only"},
    contains_word=List.Transform(ListA, (lineA)=>if List.MatchesAny(ListB, (wordB)=>Text.Contains(lineA, wordB)) = true then "yes" else "no")
in
    contains_word

Текущий запрос приводит к следующему:

    List
1   yes
2   yes
3   no
4   yes

Я хочу, чтобы результаты запроса были:

    List
1   roo
2   me
3   
4   only

Есть идеи, как это сделать?

(p.s. Я новичок в Power Query / M)

Спасибо


person Marc Pincince    schedule 26.01.2017    source источник


Ответы (2)


Я бы сделал так:

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "me", "only"},
    contains_word=List.Transform(ListA, (lineA)=>List.Select(List.Transform(ListB, (wordB)=>if Text.Contains(lineA, wordB) = true then wordB else null), (x)=>x <> null){0}?)
in
    contains_word

[отредактировано]

Идея состоит в том, чтобы использовать List.Transform дважды: внутренний изменяет список B, чтобы оставить только совпадающие значения. Затем 1-й ненулевой из последнего заменяет строку из списка A (внешний List.Tramsform).

person Eugene    schedule 26.01.2017

Изменить: кажется, вы поменяли местами первые 2 элемента результата?

Вы можете использовать следующий код:

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "help", "me", "only"},
    TableA = Table.FromList(ListA,null,{"ListA"}),
    AddedListBMatches = Table.AddColumn(TableA, "ListBMatches", (x) => List.Select(ListB, each Text.PositionOf(x[ListA], _) >= 0)),
    ExtractedValues = Table.TransformColumns(AddedListBMatches, {"ListBMatches", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    Result = ExtractedValues[ListBMatches]
in
    Result

Шаг «ExtractedValues» является результатом нажатия кнопки «Развернуть» в заголовке столбца «ListBMatches» и выбора «Извлечь значения» через запятую. Эта опция была добавлена ​​в обновлении за январь 2017 года.

Я добавил «справку» в ListB, чтобы первый элемент ListA имел 2 совпадения, которые оба возвращаются.

person MarcelBeug    schedule 26.01.2017