Автофильтр и пробельные/пустые строки

Автор eeigor, 30 января 2022, 09:30

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Автофильтр включен.
Ситуация: пусть первый столбец содержит очень длинные значения. Столбцы рядом справа заполняются не полностью. В результате данные первого столбца "забегают" на соседние столбцы, что затрудняет восприятие текста в них. Чтобы предотвратить "забегание" в пустые ячейки соответствующих столбцов вводится пробел.

Автофильтр в списке элементов столбца показывает строку с одним пробелом так: " "
Однако фильтровать её отказывается, если параметр "Условия поиска = и <> должны распространяться на всю ячейку" не задан (флажок не установлен).
Стандартный фильтр не видит эти строки при выборе условия "Содержит", но видит их при выборе условия "Начинается с" вне зависимости от значения упомянутого параметра.
Значит, автофильтр, предположительно, сжимает пробельные строки. А зачем? В списке элементов отображает, а вывести не может!..

Поскольку строка содержит всего один пробел, то значение упомянутого параметра не должно влиять на результат фильтрации. Ан нет, влияет!
Кмк, это ошибка. Я не проверял: удаляется пробел как ведущий (слева) или как хвостовой (справа). Факт в том, что само удаление значения (одного пробела) и есть ошибка. Есть другие мнения?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#1
Добрый день, Игорь!
Во вложении выделена стандартным фильтром строка, содержащая один пробел.
Владимир.

eeigor

Цитата: eeigor от 30 января 2022, 09:30если параметр "Условия поиска = и <> должны распространяться на всю ячейку" не задан
У Вас задан, Владимир. Но я снял его и наложил фильтр. Работает. А у меня не оказывает никакого действия: выводятся все записи. К сожалению, файл прислать не могу.
Отпишусь позднее.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

В таких вопросах нужно всегда еще помнить, что документ Calc может хранить в своей структуре те параметры, которые мы видим в диалоге Options / LO Calc / Calculate / General Calculations. Например (фрагмент файла content.xml):

<table:calculation-settings table:search-criteria-must-apply-to-whole-cell="false" table:automatic-find-labels="false" table:use-regular-expressions="false" table:use-wildcards="true"/>
Владимир.

kompilainenn

Цитата: eeigor от 30 января 2022, 09:30параметр "Условия поиска = и <> должны распространяться на всю ячейку" не задан
а проблему с этим параметром Любош недавно фиксил, может это имеет значение?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

Да нет, в примере Владимира данных мало, и фильтр работает верно. У меня данных очень много. И не фильтрует. Я понаблюдаю за работой автофильтра.
Однако расширенный и стандартный фильтры работают нормально.
Владимир уже как-то приводил пример неправильной работы автофильтра из-за установленного параметра "Регулярные выражения" в стандартном фильтре. Но в данном случае всё лишнее снято. Локализовать такие ошибки сложно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#6
Я выгрузил лист из приложения, где Автофильтр не работает, и почистил данные.
В таблице в поле "Поле фильтра 1" есть 3 пустых строки с номерами 1144, 1145 и [1149].
Если выбрать пункт Автофильтра "(пусто)", то эти строки не выводятся, а скрывается всё. Этот выбор, как ни странно, соответствует пункту Стандартного фильтра "пустая строка" (ничего не отображается в поле значения, см. скриншот 1).
Вывод: "(пусто)" = "" (без кавычек).

Зато пустые данные удаётся отфильтровать в Стандартном фильтре выбором значения "Пусто" (без кавычек, см. скриншот 2).
Такого пункта в Автофильтре нет, а "Пусто" не равно "(пусто)". Или равно: смотря с какой стороны подойти (этот парадокс описан ниже). :)

Просьба проверить в своей среде.


UPDATED 1: И в чём должна быть разница между значениям Стандартного фильтра "Пусто" и ""? Разница, как я убедился, есть, но её быть не должно.
И надо бы привести в соответствие пункты: "(пусто)", "Пусто" и "". В английской локали:  "(empty)", "Empty" и "" – то есть также.
Вообще-то интересно: есть разница в наименованиях "(пусто)" и "Пусто" – и вот вам разница в работе!
Разработчик Стандартного фильтра допускает различные интерпретации пустой строки, раз предлагает два пункта для выбора.
Но пользователя это только сбивает с толку.

Да, и ещё. Если Вы выберете пункт "Пусто" в Стандартном фильтре, то пустые строки будут отфильтрованы, а в Автофильтре – внимание! – будет выбран пункт "(пусто)", хотя соответствие между этими значениями двух фильтров не установлено (см. вывод по первому абзацу). Но если выбрать пункт "(пусто)" непосредственно в Автофильтре, то будут скрыты все строки.
По крайней мере, у меня работает так. Описал подробно.

Этот парадокс выглядит приблизительно так (АФ, СФ – Авто- и Стандартный фильтры):
[АФ:"(пусто)"] = [СФ:""] и [СФ:"Пусто"] = [АФ:"(пусто)"] при выборе в СФ, но [АФ:"(пусто)"] <> [СФ:"Пусто"] при выборе в АФ.


UPDATED 2: Файл заменён: "Пример с автофильтром (2).ods".
Добавлена изначально заявленная проблема с пробельными строками. См. поле "Поле фильтра 3". При выборе пункта с пробелом (" ") ни один фильтр у меня не фильтрует правильно: выводятся все записи, кроме пустых (то есть содержащие пробел и другие строки, где другие строки – лишние). В Стандартном фильтре этот пункт идёт вторым после пустой строки: "", " " (см. скриншот 3).
Однако, как я уже упоминал выше, мини-пример Владимира у меня работает правильно. Ну, вот вам макси-пример. Не работает.
Смысл примера тот же.

UPDATED 3: Заменим во второй строке поля "Поле фильтра 3" значение 80000000000 (оформатировано как: "8 (000) 000-00-00") на "Тра-та-та", и наложим фильтр только по пробельной строке (" "). На этот раз строка "Тра-та-та" будет скрыта, а вот все остальные 29 строк (80000000000) – нет.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#7
Цитата: eeigor от  3 февраля 2022, 10:50Однако, как я уже упоминал выше, мини-пример Владимира у меня работает правильно.
Оформатировал поле, как у меня. Добавил к числовым текстовую строку. Всё работает. Всё фильтрует.

Сократил свой пример до нескольких строк (мини-файл как у Владимира). Не работает! Полтергейст.

Изменённый файл Владимира и сокращённый свой прилагаются.

Файл в посте выше и файлы здесь обновлены.

UPDATED: А вот тут начинается самое интересное.
Открыл оба прилагаемых файла (первые два).
Выполнил экспорт листа из своего файла в файл Владимира. Мой лист начал работать.
А теперь наоборот: выполнил экспорт листа из файла Владимира в свой файл. Лист Владимира перестал работать. Оба файла (последние два) тоже приложены.
Вывод: в ходе разработки приложения с файлом что-то произошло, что повлияло на работу автофильтра.

На каком этапе вкрадывается ошибка, неясно. Как этого избегать в будущем – непонятно.
Проблема в файле. Как это устранить "малой кровью"? Приложение очень большое.

Выполнил экспорт всех листов и программных модулей своего приложения в новый (чистый) файл. Все ошибки фильтрации остались. Проблема!
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Обязательно посмотрю вечером (по московскому времени).  :)
Владимир.

eeigor

#9
OFFTOPIС
У меня был случай (кому-то помогал решить вопрос), когда возникла ошибка, "подрывающая доверие" к продукту (Calc). Открыл тему, и разработчик @erAck довольно быстро нашёл, а впоследствии и устранил тот тонкий и скрытый баг (a crash in the iteration resolver). Доверие к продукту было восстановлено. :)
Похоже, здесь мы (или я) столкнулись с подобным случаем, когда надо восстановить доверие к продукту. Автофильтр – это важное и широко используемое функциональное средство.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#10
Похоже, ошибку удалось локализовать.
Все описанные мной выше "странности" исчезают, если установить параметр: Параметры - LibreOffice Calc - Вычисления - Общие вычисления: Условия поиска = и <> должны распространяться на всю ячейку. (см. скришошт).

Это явный баг. А в последнее время с этим параметром велась работа (функции типа MATCH и иже с ней не реагировали на этот флаг). Ну, вот теперь так... :(
Не уверен, что это регресс (как было раньше, не знаю), но скорее, что да.

Однако я предпочитаю этот флажок держать сброшенным, чтобы при использовании расширенного фильтра не заниматься ерундой, добавляя слева и справа символы расширения строки: .*УСЛОВИЕ.* в ячейках диапазона условий расширенного фильтра.
Значит, коли используешь автофильтр, ставь флажок и редактируй формулы.

Владимир (@sokol92), мне пришлось проанализировать параметры двух файлов и выявить критическое расхождение. Так что спасибо.

Что ж, все эти вопросы оказались тесно связаны у меня с использованием регулярных выражений.
OFFTOPIС
Поблагодарю и Михаила (@mikekaganski) за подсказку про метасимволы регулярных выражений: \Q и \E. Читал, видел, но не использовал и не знал, где это может пригодиться. Так вот очень пригодилось.
Регулярное выражение теперь пишу с условием (для примера: в ячейке A1) в кавычках как литерал ("^\Q"&A1&"\E$") и без расширения строки ("^\Q"&A1&"\E$"). Обрамление условия в ячейке A1 символами регулярного выражения начала и конца строки обеспечивает точное совпадение критерия с данными. Иначе результаты сравнения бывали неожиданными. Теперь нет. Однако требования к качеству данных возросли: никаких лишних пробелов и пр. Эту проблему решают специальные процедуры "причёсывания" исходных данных. Да, это не СУБД.
Таким образом, результат сравнения данных не зависит от значения параметра: Параметры - LibreOffice Calc - Вычисления - Общие вычисления: Условия поиска = и <> должны распространяться на всю ячейку.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Баг репорт напишите, возможно Любош, пока еще помнит эту тему, исправит такое поведение. Последним, кто правил эту опцию был он, https://bugs.documentfoundation.org/show_bug.cgi?id=139612 и посмотрите на комментарий 18 там
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

Посмотрел. Там всё-таки речь о работе функций с учётом этого параметра. Могло ли отразиться на работе самого автофильтра? Плюс там сказано: available in 7.3.0.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

"Философское" замечание.
Поскольку Excel уже давно и прочно вошел в нашу жизнь, а мы пишем программы для LO, которые будут использовать другие, то, на мой взгляд, лучше всего ориентироваться на значения параметров, совместимые с Excel (если применимо). Разработчики, в принципе, так и действуют. Мне известно одно существенное различие в параметрах вычислений - "Учитывать регистр". "Из коробки" в формулах Calc регистр букв учитывается, в формулах Excel - нет. Это не влияет на ранее созданные документы при работе в Calc, но макрос вполне может создать новую книгу и заносить в нее формулы. Кроме того, возникают проблемы при сохранении документов в форматах Excel - результаты вычисления формул типа

="a"="A"

изменяются.
Владимир.

mikekaganski

#14
Цитата: sokol92 от  4 февраля 2022, 17:19"Из коробки" в формулах Calc регистр букв учитывается

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

Цитата: sokol92 от  4 февраля 2022, 17:19="a"="A"

А, извините за слепоту.
С уважением,
Михаил Каганский