Фильтр без учета регистра в PowerQwery.xlsx (40,0 КиБ, 250 скачиваний)
Представим ситуацию, когда в нашей таблице данные хоть и упорядочены и организованы, но не имеют четкого написания в части регистра:
И если необходимо отобрать данные по конкретному поставщику(например, ИП Иваныч)
мы получим исключительно те строки, которые в точности равны заданной строке, вплоть до каждой буковки и её регистра. Но у нас же есть и другие строки, которые относятся точно к тому же поставщику, но записаны маленькими(строчными) буквами. В окне фильтрации никаких опций для игнорирования регистра нет. Равно как нет этого и в настройках запроса. С одной стороны мы можем просто выбрать все варианты из выпадающего списка фильтра:
но что, если нам надо применить условие И/ИЛИ? Или вариантов написания слишком много и все выбирать неудобно или текст может быть более длинным и просто не помещаться в окне условий?
По сути решение очевидно и напрашивается само собой: привести к единому регистру все значения в столбце и после этого отфильтровать.
Конечно, можно сделать все при помощи мышки – создаем дубликат столбца «Поставщик»(правая кнопка мыши – Создать дубликат столбца
Но лично для меня проще в строке формул привести к единому регистру сравниваемые данные. Т.е. выделяем в навигаторе шаг фильтрации -переходим в строку формул
и вместо выражения
= Table.SelectRows(Source, each [Поставщик] = "ИП Иваныч") |
Записываем такое:
= Table.SelectRows(Source, each Text.Lower([Поставщик]) = Text.Lower("ИП Иваныч")) |
Функция
Но что делать, если нам надо отобрать по условию: начинается с, заканчивается на, содержит и т.п.? В данном случае есть два варианта.
Самый очевидный – так же как в случае с равенством просто приводим к единому регистру условие и данные. Например, мы выбрали условие «Начинается с». Строка будет выглядеть изначально так:
= Table.SelectRows(Source, each Text.StartsWith( [Поставщик], "ИП Иваныч")) |
А нам необходимо подправить её на такую:
= Table.SelectRows(Source, each Text.StartsWith(Text.Lower([Поставщик]), Text.Lower("ИП Иваныч"))) |
В случае с условием «Содержит» правим исходную строку
= Table.SelectRows(Source, each Text.Contains( [Поставщик], "ИП Иваныч")) |
На эту:
= Table.SelectRows(Source, each Text.Contains(Text.Lower([Поставщик]), Text.Lower("ИП Иваныч"))) |
Т.е. просто так же добавляем функцию
Но во всех этих функциях(
В итоге наши исходные строки были такие:
= Table.SelectRows(Source, each Text.StartsWith( [Поставщик], "ИП Иваныч")) = Table.SelectRows(Source, each Text.Contains( [Поставщик], "ИП Иваныч")) |
А мы запишем их так:
= Table.SelectRows(Source, each Text.StartsWith( [Поставщик], "ИП Иваныч", Comparer.OrdinalIgnoreCase)) = Table.SelectRows(Source, each Text.Contains( [Поставщик], "ИП Иваныч", Comparer.OrdinalIgnoreCase)) |
Но тут есть нюанс: как показала практика этот параметр может быть проигнорирован в некоторых версиях Power Query. Причину пока не понял, но упомянуть об этом точно стоит 😊 Так что если фокус с Comparer.OrdinalIgnoreCase не взлетит – используйте топорный, но 100%-ый вариант с приведением к единому регистру через
Фильтр без учета регистра в PowerQwery.xlsx (40,0 КиБ, 250 скачиваний)