Фильтрация списка с помощью другого списка в коде PowerQuery M

У меня есть список имен столбцов. Я хочу отфильтровать список, используя элементы из другого списка. Я хочу вернуть все имена столбцов, которые содержат какие-либо элементы в списке myFilter. Если фильтр является текстовым элементом, я могу сделать фильтр, но мне не удалось просмотреть каждый элемент и вернуть список.

ColumnNames= {"E ID", "W ID", "P Chemical", "XIC","YFE","ZIC"}
myFilter = {"W ID","IC"}

Результат должен быть:

Result = {"W ID","P Chemical", "XIC", "ZIC"}

Поскольку IC содержится в Chemical, XIC и ZIC, W ID полностью совпадает.

Я предполагаю, что это должно быть что-то вроде этого:

List.Select(ColumnNames, each Text.Contains(_, each myFilter{_}))

Потому что это работает с этим

List.Select(ColumnNames,each Text.Contains(_,"W ID")) 

Но я не могу получить правильный код, и я ценю помощь.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
0
57
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Проверить

List.Select(ColumnNames, each List.Contains(myFilter , _)) 

элементы списка не совпадают точно, но текст в myFilter должен соответствовать Text.Contains или чему-то подобному.

Rafadan 22.02.2023 13:58

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

Rafadan 22.02.2023 14:01

Вы можете использовать функции набора, такие как пересечение.

= List.Intersect({ColumnNames, myFilter})



let
   ColumnNames= {"E ID", "W ID", "P Chemical", "XIC","YFE","ZIC"},
    myFilter = {"W ID","IC"},
    result = List.Intersect({ColumnNames, myFilter})
in
    result

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

Rafadan 22.02.2023 14:03
Ответ принят как подходящий

Я бы сделал это так.

let
    columnNames= {"E ID", "W ID", "P Chemical", "XIC","YFE","ZIC"},
    #"Converted to Table" = Table.FromList(columnNames, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "columnNames"}}),
    myFilter = {"W ID","IC"},
    #"Added Custom" = Table.AddColumn(#"Renamed Columns", "filter", each myFilter),
    #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "filter"),
    #"Added Custom1" = Table.AddColumn(#"Expanded Custom", "match", each if Text.Contains([columnNames], [filter], Comparer.OrdinalIgnoreCase) then true else false),
    #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each [match] = true)[columnNames]
in
    #"Filtered Rows"

Ради забавы

let ColumnNames= {"E ID", "W ID", "P Chemical", "XIC","YFE","ZIC"},
myFilter = {"W ID","IC"},
Part1=List.Transform(ColumnNames, each let q=_ in try Table.SelectRows (Table.FromList(myFilter), each Text.Contains(q,[Column1], Comparer.OrdinalIgnoreCase)){0}[Column1] otherwise null),
Part2= List.RemoveNulls(List.Transform(List.Positions(ColumnNames),each if Part1{_}=null then null else ColumnNames{_}))
in Part2

Другие вопросы по теме