У меня есть список имен столбцов. Я хочу отфильтровать список, используя элементы из другого списка. Я хочу вернуть все имена столбцов, которые содержат какие-либо элементы в списке 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"))
Но я не могу получить правильный код, и я ценю помощь.
Проверить
List.Select(ColumnNames, each List.Contains(myFilter , _))
Я обновил вопрос с желаемым результатом, чтобы сделать его более понятным. Мне нужно сопоставить любую часть текста в фильтре с именами столбцов.
Вы можете использовать функции набора, такие как пересечение.
= 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
Я обновил вопрос с желаемым результатом, чтобы сделать его более понятным. Мне нужно сопоставить любую часть текста в фильтре с именами столбцов.
Я бы сделал это так.
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
элементы списка не совпадают точно, но текст в myFilter должен соответствовать Text.Contains или чему-то подобному.