Как удалить строки на основе списка значений, разделенных запятыми, в параметре Power BI в Power Query? - PullRequest
3 голосов
/ 17 января 2020

У меня есть список данных с заголовком столбца (среди многих других столбцов), и у меня есть параметр Power BI, который имеет, например, значение «a, b, c». Что я хочу сделать, это l oop через значения параметра и удалить все строки, начинающиеся с этих символов.

Например:

Title
a
b
c
d

Должно стать

Title
d

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

parameterList = Text.Split(<parameter-name>,",")

, но тогда я не уверен, как продолжать использовать его для фильтрации. Для одного значения я бы просто использовал

#"Filtered Rows" = Table.SelectRows(#"Table", each Text.StartsWith([key], <value-to-filter-on>))

, но это допускает только одно значение.

РЕДАКТИРОВАТЬ: Возможно, я плохо сформулировал свой первоначальный вопрос. Разделенные запятыми значения в parameterList могут содержать любое количество символов (например, a, abcd, foo, bar), и я хочу посмотреть, начинается ли значение в [key] с этой строки символов.

Ответы [ 3 ]

4 голосов
/ 17 января 2020

Попробуйте использовать List.Contains, чтобы проверить, есть ли начальный символ в списке параметров.

each List.Contains(parameterList, Text.Start([key], 1)

Редактировать: Поскольку вы изменили требование, попробуйте это :

Table.SelectRows(
    #"Table",
    (C) => not List.AnyTrue(
                   List.Transform(
                       parameterList,
                       each Text.StartsWith(C[key], _)
                    )
                )
 )

Для каждой строки это преобразует parameterList в список значений true/false, проверяя, начинается ли текущий key с каждой текстовой строки в списке. Если значение true, List.AnyTrue возвращает значение true, и мы выбираем не выбирать эту строку.

1 голос
/ 18 января 2020

Это, кажется, работает довольно хорошо:

= List.Select(Source[Title], each Text.Contains(Parameter1,Text.Start(_,1))=false)

Замените Источник на имя вашей таблицы и Параметр1 на имя вашего параметра.

1 голос
/ 17 января 2020

Поскольку вы хотите отфильтровать все значения из параметра, вы можете использовать что-то вроде:

= Table.SelectRows(#"Changed Type", each List.Contains(Parameter1,Text.Start([Title],1))=false)

Еще один способ сделать это - создать пользовательский столбец в таблице, который имеет первый символ заголовка:

= Table.AddColumn(#"Changed Type", "FirstChar", each Text.Start([Title],1))

, а затем используйте это поле в шаге фильтра:

= Table.SelectRows(#"Added Custom", each List.Contains(Parameter1,[FirstChar])=false)

Я проверил это с небольшим набором образцов, и, кажется, он работает нормально. Вы можете проверить оба и посмотреть, помогает ли это с производительностью. Если вы по-прежнему сталкиваетесь с проблемами производительности, возможно, будет проще, если вы сможете поделиться файлом pbix.

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