Power Query: функция для поиска в столбце списка ключевых слов и возврата только строк с хотя бы одним соответствием - PullRequest
0 голосов
/ 09 апреля 2020

Я делаю простую Google-подобную функцию поиска в Power Query. Допустим, у меня есть столбец с именем Описание в таблице с именем База данных . Затем пользователь вводит несколько поисковых запросов, таких как «собака, кошка, животные». Я хочу отфильтровать База данных для строк, которые содержат хотя бы одно из этих ключевых слов. Эти ключевые слова могут меняться каждый раз, в зависимости от того, что пользователь вводит в именованном диапазоне в Excel.

Я знаю, что вы можете отфильтровать столбец в Power Query по нескольким ключевым словам, например:

FilterRows = Table.SelectRows(LastStep, each Text.Contains([English], "dog") or Text.Contains([English], "cat")),

но эти ключевые слова - stati c, а столбец также stati c. Я хочу иметь возможность контролировать как ключевые слова, так и имя столбца в качестве переменных. Я думаю, что мне нужно написать функцию, но я не уверен, как начать.

1 Ответ

1 голос
/ 09 апреля 2020

Ваш вопрос требует нескольких движущихся частей.

Во-первых, я бы получил ключевые слова из именованного диапазона "Ключевые слова" в таблицу, подобную этой:

{KeywordTbl}
let
    GetKeywords = if Excel.CurrentWorkbook(){[Name="Keywords"]}[Content]{0}[Column1] = null then null else Text.Split(Excel.CurrentWorkbook(){[Name="Keywords"]}[Content]{0}[Column1], ", "),
    ConvertToTable = Table.FromList(GetKeywords,null,{"Keywords"})
in
    ConvertToTable

Во-вторых, сохраните столбец имя, где вы хотите искать в именном диапазоне Excel под названием «ColName». Затем перетащите именованный диапазон в Power Query следующим образом:

{ColName}
let
    GetColName = Excel.CurrentWorkbook(){[Name="ColName"]}[Content]{0}[Column1]
in
    GetColName

Затем я напишу функцию, которая принимает 4 переменные: таблицу и столбец, которые вы хотите просмотреть, а также таблицу и столбец, содержащие ключевые слова:

{SearchColForKeywords}
(LookInTbl as table, KeywordTbl as table, LookInCol as text, KeywordCol as text) =>
let
    RelativeMerge = Table.AddColumn(LookInTbl, "RelativeJoin", 
        (Earlier) => Table.SelectRows(KeywordTbl, 
            each Text.Contains(Record.Field(Earlier, LookInCol), Record.Field(_, KeywordCol), Comparer.OrdinalIgnoreCase))),
    ExpandRelativeJoin = Table.ExpandTableColumn(RelativeMerge, "RelativeJoin", {KeywordCol}, {"Keywords found"}),
    FilterRows = Table.SelectRows(ExpandRelativeJoin, each [Keywords found] <> null and [Keywords found] <> ""),

    // Concatenate multiple keyword founds line into one line 
    GroupAllData = Table.Group(FilterRows, {"Word ID"}, {{"AllData", each _, type table [First column=text, Second column=text, ... your other columns=text]}}),
    AddCol = Table.AddColumn(GroupAllData, "Keywords found", each [AllData][Keywords found]),
    ExtractValues = Table.TransformColumns(AddCol, {"Keywords found", each Text.Combine(List.Transform(_, Text.From), ", "), type text}),
    DeleteAllData = Table.RemoveColumns(ExtractValues,{"AllData"}),
    MergeQueries = Table.NestedJoin(DeleteAllData, {"Word ID"}, FilterRows, {"Word ID"}, "DeleteAllData", JoinKind.LeftOuter),
    ExpandCols = Table.ExpandTableColumn(MergeQueries, "DeleteAllData", {"First Col name", "Second col name", ... "Your Other column names here"}),
    DeleteKeywordsFound = Table.RemoveColumns(ExpandCols,{"Keywords found"})
in
    DeleteKeywordsFound

К вашему сведению, половина этой функции была разработана пользователем с именем lmkeF ​​в сообществе PowerBI. Полное обсуждение здесь . Я просто улучшил его решение.

Наконец, я буду использовать эту функцию в другом запросе, подобном следующему:

StepName = SearchColForKeywords(MainTbl, KeywordTbl, ColName, "Keywords"),

Вы можете настроить 4 имени переменной.

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