Нужно оставить урлы, в которые входят домены из списка.

Автор Mric, 12 января 2022, 16:29

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

eeigor

#30
Цитата: Mric от 14 января 2022, 17:03Через раз работает, например, вот: https://i2.piccy.info/i9/dc8eaed246c50538607d88f4a1f14e37/1642168952/163764/1454798/454.png
@Mric, на Вашей картинке показан верный результат.
10000 – это много и долго. Но Вы ведь не сформулировали задачу сразу в полном объёме.


Updated:
По скорости приемлемо. Но ведь это Вы должны попробовать на реальных данных и нам сказать: быстро или нет.
Обычно нет необходимости оптимизировать такие задачи...
А для того, чтобы учитывать сортировку доменов (и сразу выходить из цикла поиска), надо знать с какой позиции начинать сравнение входящего фрагмента (домена). Сейчас, да, сравнение идёт по всей строке до конца (оператор Like: "URL" Like "*" & domain & "*").
Мы можем ответить на вопрос: с какой позиции строго следует наименование домена в строке? После "https://"?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: sokol92 от 14 января 2022, 18:13Поиск по отсортированному списку намного быстрее, некоторые функции Calc это умеют.
Как я понимаю, если мы к функции поиска добавим * (или: .*) справа, но не слева. В общем, надо зафиксировать положение входящей подстроки в самой строке.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 14 января 2022, 18:25
Цитата: Mric от 14 января 2022, 17:03Через раз работает, например, вот: https://i2.piccy.info/i9/dc8eaed246c50538607d88f4a1f14e37/1642168952/163764/1454798/454.png
@Mric, на Вашей картинке показан верный результат.
10000 – это много и долго. Но Вы ведь не сформулировали задачу сразу в полном объёме.


Updated:
По скорости приемлемо. Но ведь это Вы должны попробовать на реальных данных и нам сказать: быстро или нет.
Обычно нет необходимости оптимизировать такие задачи...
А для того, чтобы учитывать сортировку доменов (и сразу выходить из цикла поиска), надо знать с какой позиции начинать сравнение входящего фрагмента (домена). Сейчас, да, сравнение идёт по всей строке до конца (оператор Like: "URL" Like "*" & domain & "*").
Мы можем ответить на вопрос: с какой позиции строго следует наименование домена в строке? После "https://"?

Нет, там может быть как http, так и https и еще прибавляться www.

Как верный, а domain7 и domain8 не должен быть true?

eeigor

Видимо, должен. Вы добавили строки, а ссылку на диапазон Domains обновили?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 17 января 2022, 10:55
Видимо, должен. Вы добавили строки, а ссылку на диапазон Domains обновили?

А где он выставляется, в самом коде макроса?

eeigor

В диалоге Управления именами. Если не ошибаюсь, Ctrl+F3
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#36
Вы отпишитесь по скорости на реальных данных: может ничего больше и не надо.

Функция Contains() универсальная.
Если оптимизировать по скорости, сортировать список доменов, то функцию придётся переделать.

Вопрос: А если домен идёт с префиксом, наличие этого префикса в проверяемой строке тоже обязательно? Сейчас – да.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 17 января 2022, 11:25
В диалоге Управления именами. Если не ошибаюсь, Ctrl+F3
Спасибо, все работает!

eeigor

#38
Посмотрите исходный пример с добавленными в дополнение к макросу 5-ю способами вычислений с использованием формул.

Для заполнения формулами массива других ячеек надо не протягивать мышкой формулу сверху вниз, а скопировать её, выделить диапазон вставки и вставить формулу из буфера обмена (Copy&Paste). В каждую выделенную ячейку будет вставлена своя формула массива со ссылками на нужную ячейку в текущей строке.

Updated:
В основе формула @Bigor из ответа #24 и формула @mikekaganski из ответа #25.

@Mric, использование SUMPRODUCT вместо SUM (без Ctrl+Shift+Enter) упрощает задачу протягивания мышкой формулы или мгновенного заполнения (крестик в правом нижнем углу ячейки с формулой). Всё работает.

Чем больше список доменов, тем медленнее будет работать функция Contains(), так как перебор значений осуществляется в цикле For - Next. Формулы массива используют внутренний цикл и, казалось бы, должны работать быстрее. Однако на наборе данных (см. ответ #30), равным 100 URL и 1000 доменов, функция Contains() работает быстрее в 2 раза (у меня 4 с против 8 с).

Файл обновлён.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Что-то не работает, просмотрел урлы, например dramtezi.ru и dpa1.ru нет в списке доменов, но они показываются как TRUE. Урлы начинаются за 7800 строкой.

Mric

Цитата: eeigor от 18 января 2022, 00:03
Посмотрите исходный пример с добавленными в дополнение к макросу 5-ю способами вычислений с использованием формул.

Для заполнения формулами массива других ячеек надо не протягивать мышкой формулу сверху вниз, а скопировать её, выделить диапазон вставки и вставить формулу из буфера обмена (Copy&Paste). В каждую выделенную ячейку будет вставлена своя формула массива со ссылками на нужную ячейку в текущей строке.

Updated:
В основе формула @Bigor из ответа #24 и формула @mikekaganski из ответа #25.

@Mric, использование SUMPRODUCT вместо SUM (без Ctrl+Shift+Enter) упрощает задачу протягивания мышкой формулы или мгновенного заполнения (крестик в правом нижнем углу ячейки с формулой). Всё работает.

Чем больше список доменов, тем медленнее будет работать функция Contains(), так как перебор значений осуществляется в цикле For - Next. Формулы массива используют внутренний цикл и, казалось бы, должны работать быстрее. Однако на наборе данных (см. ответ #30), равным 100 URL и 1000 доменов, функция Contains() работает быстрее в 2 раза (у меня 4 с против 8 с).

Файл обновлён.

Но в некоторых случаях он нормально фильтрует, но все равно оставляет урлы, доменов которых нет в списке.

bigor

дело в том, что у Вас в диапазон доменов попадают пустые ячейки, UDF заменяет их 2 мя звездочками и соответственно под  это подходит любой адрес. Или диапазон доменов, должен быть размером с заполненной таблицы доменов, либо пустые ячейки диапазона доменов забить информацией, которой не может быть в имени домена
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Mric

Цитата: Bigor от 20 января 2022, 11:43
дело в том, что у Вас в диапазон доменов попадают пустые ячейки, UDF заменяет их 2 мя звездочками и соответственно под  это подходит любой адрес. Или диапазон доменов, должен быть размером с заполненной таблицы доменов, либо пустые ячейки диапазона доменов забить информацией, которой не может быть в имени домена

Т.е. у меня 7800 ячеек должно быть доменов, но там условно 1500 и он криво работает из-за этого?

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Mric

Цитата: Bigor от 20 января 2022, 11:43
дело в том, что у Вас в диапазон доменов попадают пустые ячейки, UDF заменяет их 2 мя звездочками и соответственно под  это подходит любой адрес. Или диапазон доменов, должен быть размером с заполненной таблицы доменов, либо пустые ячейки диапазона доменов забить информацией, которой не может быть в имени домена
Точно, спасибо, работает!