Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

22 Январь 2022, 20:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Нужно оставить урлы, в которые входят домены из списка.  (Прочитано 1847 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mric
Участник
**
Offline Offline

Сообщений: 38


« Стартовое сообщение: 12 Январь 2022, 16:29 »

Всем привет. У меня есть список доменов, формата domain.com, и есть урлы. Нужно оставить урлы, в которые входят домены из списка. Из оставшихся урлов удалить те которые меньше 40 символов. Заранее спасибо!
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 215


« Ответ #1: 12 Январь 2022, 17:26 »

Привет. А где пример?
Записан

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

Сообщений: 38


« Ответ #2: 12 Январь 2022, 17:46 »

Список доменов:
domain1.com
domain2.com
domain3.com
domain4.com

Урлы:
https://domain1.com/5445456456546456546456456456456546546
https://domain2.com/5645645645654665756657657756765765765756765
https://domain3.com/45546456546
https://domain4.com/654556657766776
https://domain5.com/6456456546546
https://domain6.com/6456456546546

Должно остаться после первого фильтра:
https://domain1.com/5445456456546456546456456456456546546
https://domain2.com/5645645645654665756657657756765765765756765
https://domain3.com/45546456546
https://domain4.com/654556657766776

Это я не беру длину строки.
Записан
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 845



« Ответ #3: 12 Январь 2022, 19:04 »

Попробуйте применить расширенный фильтр. Добавлен вспомогательный столбец Length (Длина строки).
Поскольку используются регулярные выражения, то символ точки в доменном имени надо экранировать: Domain1\.com

UPDATED 1:
Прикреплен второй файл (filter-urls (1).ods), где у меня, в отличие от решения подобных задач в MS Excel, не получается использовать формулу в критериях расширенного фильтра. Кто может подсказать? Относительная ссылка в формуле на первую ячейку диапазона данных (A8) работает только с первой ячейкой, а фильтр должен перебрать все ячейки с URL и отфильтровать по длине строки. Однако я раньше не пробовал этого. Возможно, ошибка в синтаксисе формулы при построении критерия.

Отфильтрует только первую запись:
URL: ="="&(LEN(A8)>=40)

UPDATED 2: Возможно, это баг. Ведь здесь должно быть так, как в условном форматировании: указываем первую ячейку диапазона. Но я ещё не встречал подобных решений в LO Calc. То есть я пытаюсь построить критерий по двум значениям одного поля URL без добавления вспомогательного столбца.

Кое-какой материал можно найти здесь для понимания сути проблемы и примерных решений ("Using Advanced Filter in Excel - criteria range examples with formulas").

UPDATED 3: В руководстве эта тема (критерии фильтра с формулами) не освещена.

* filter-urls.ods (12.34 Кб - загружено 4 раз.)
* filter-urls (1).ods (14.32 Кб - загружено 1 раз.)

* Снимок экрана от 2022-01-12 19-54-28.png (25.16 Кб, 472x244 - просмотрено 2 раз.)
« Последнее редактирование: 12 Январь 2022, 22:38 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.4.1 Community
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 845



« Ответ #4: 12 Январь 2022, 21:21 »

=NOT(ISNA(REGEX(A8;"domain[1-4]\.com")))*(LEN(A8)>=40)
Отфильтровать (скрыть) автофильтром "правильные" строки, удалить оставшиеся строки и отменить автофильтр.

Или наоборот:
=((ISNA(REGEX(A8;"domain[1-4]\.com")))+(LEN(A8)<40)>0)
« Последнее редактирование: 12 Январь 2022, 21:37 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.4.1 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 215


« Ответ #5: 13 Январь 2022, 08:46 »

В качестве примера я ждал ods файлик  
Воспользуемся, подготовленным @eeigor

Массивной формулой
Код:
=IFERROR(INDEX($E$2:$E$7;SMALL(IF((ISNUMBER(SEARCH($A$2:$A$5;$E$2:$E$7))*(LEN($E$2:$E$7))>=40);ROW($E$2:$E$7)-1;"");ROW(A1)));"")

"domain[1-4]\.com"
а потом окажется, что это для примера, такие имена доменов, а по факту zxcert.com и adsfjutd.ru

* formula-urls.ods (13.96 Кб - загружено 2 раз.)
« Последнее редактирование: 13 Январь 2022, 08:49 от Bigor » Записан

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

Сообщений: 38


« Ответ #6: 13 Январь 2022, 11:07 »

В качестве примера я ждал ods файлик 
Воспользуемся, подготовленным @eeigor

Массивной формулой
Код:
=IFERROR(INDEX($E$2:$E$7;SMALL(IF((ISNUMBER(SEARCH($A$2:$A$5;$E$2:$E$7))*(LEN($E$2:$E$7))>=40);ROW($E$2:$E$7)-1;"");ROW(A1)));"")

"domain[1-4]\.com"
а потом окажется, что это для примера, такие имена доменов, а по факту zxcert.com и adsfjutd.ru

Прошу прощения, что ввел вас в заблуждение, но там реально будут домены zxcert.com и adsfjutd.ru. Т.е. привязка будет ко всей строке, где домен расположен, а не перебор domain и цифры правее.
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 215


« Ответ #7: 13 Январь 2022, 11:11 »

привязка будет ко всей строке
мой вариант из #5 ищет совпадения по любой строке
Записан

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

Сообщений: 38


« Ответ #8: 13 Январь 2022, 11:41 »

привязка будет ко всей строке
мой вариант из #5 ищет совпадения по любой строке


Спасибо большое)
Записан
Mric
Участник
**
Offline Offline

Сообщений: 38


« Ответ #9: 13 Январь 2022, 11:48 »

=IFERROR(INDEX($E$2:$E$7;SMALL(IF((ISNUMBER(SEARCH($A$2:$A$5;$E$2:$E$7))*(LEN($E$2:$E$7))>=40);ROW($E$2:$E$7)-1;"");ROW(A1)));"")
А ее применить, отдельно от файла вашего? Не очень понимаю куда втыкать ее.
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 215


« Ответ #10: 13 Январь 2022, 11:52 »

Код:
=IFERROR(INDEX($E$2:$E$7;SMALL(IF((ISNUMBER(SEARCH($A$2:$A$5;$E$2:$E$7))*(LEN($E$2:$E$7))>=40);ROW($E$2:$E$7)-1;"");ROW(A1)));"")

$E$2:$E$7 - диапазон url
$A$2:$A$5 - диапазон доменов
 -1 это смещение диапазона url относительно первой строки. Т.е. у меня он начинается в е2, поэтому 1-2 = -1, если в третьей строке начинается то 1-3=-2 итп


правите адреса диапазонов под свои по всей формуле, затем вводите ее 3мя кнопками Ctrl+Shift+Enter (так как массивная) и должна работать.
 У вас скорее всего в настройках стоят русские формулы, нужно будет или снять флажок или перевести функции на русский.
« Последнее редактирование: 13 Январь 2022, 11:55 от Bigor » Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 845



« Ответ #11: 13 Январь 2022, 16:23 »

@Mric, а может, так проще будет - с макросом Contains()? Файл прилагается.

C10: =CONTAINS(A10;Domains)*(LEN(A10)>=40)

В результате перемножения условий получается число 0 или 1, поэтому задайте ячейкам логический формат, чтобы получить ЛОЖЬ или ИСТИНА.
Отфильтруйте автофильтром "ложные" строки, выделите их и смело удалите. Отмените фильтр. Получите требуемый результат.

Код:
Function Contains(str$, data) As Boolean
''' Returns: True if the <str> string contains any substring in <data>, and False if not.

    Dim i%, pattern$
    Contains = False

    If IsArray(data) Then
        For i = LBound(data) To UBound(data)
            pattern = "*" & data(i, 1) & "*"
            If str Like pattern Then
                Contains = True
                Exit For
            End If
        Next
    Else
        pattern = "*" & data & "*"
        Contains = str Like pattern
    End If
End Function

Кстати, обратил внимание, что по умолчанию функция возвращает True, а в VBA вернула бы False, поэтому следующая строка обязательна:
    Dim i%, pattern$
    Contains = False

File Updated

* formula-urls-contains.ods (15.93 Кб - загружено 6 раз.)
« Последнее редактирование: 14 Январь 2022, 11:39 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.4.1 Community
Mric
Участник
**
Offline Offline

Сообщений: 38


« Ответ #12: 13 Январь 2022, 17:47 »

@Mric, а может, так проще будет - с макросом Contains()? Файл прилагается.

C10: =CONTAINS(A10;Domains)*(LEN(A10)>=40)

В результате перемножения условий получается число 0 или 1, поэтому задайте ячейкам логический формат, чтобы получить ЛОЖЬ или ИСТИНА.
Отфильтруйте автофильтром "ложные" строки, выделите их и смело удалите. Отмените фильтр. Получите требуемый результат.

Код:
Function Contains(str$, data) As Boolean
''' Returns: True if the <str> string contains any substring in <data>, and False if not.

    Dim i%, pattern$
    Contains = False

    If IsArray(data) Then
        For i = LBound(data) To UBound(data)
            pattern = "*" & data(i, 1) & "*"
            If str Like pattern Then
                Contains = True
                Exit For
            End If
        Next
    Else
        pattern = "*" & data & "*"
        Contains = str Like pattern
    End If
End Function

Кстати, обратил внимание, что по умолчанию функция возвращает True, а в VBA вернула бы False, поэтому следующая строка обязательна:
    Dim i%, pattern$
    Contains = False

Спасибо!
Записан
Mric
Участник
**
Offline Offline

Сообщений: 38


« Ответ #13: 13 Январь 2022, 18:37 »

Код:
=IFERROR(INDEX($E$2:$E$7;SMALL(IF((ISNUMBER(SEARCH($A$2:$A$5;$E$2:$E$7))*(LEN($E$2:$E$7))>=40);ROW($E$2:$E$7)-1;"");ROW(A1)));"")

$E$2:$E$7 - диапазон url
$A$2:$A$5 - диапазон доменов
 -1 это смещение диапазона url относительно первой строки. Т.е. у меня он начинается в е2, поэтому 1-2 = -1, если в третьей строке начинается то 1-3=-2 итп


правите адреса диапазонов под свои по всей формуле, затем вводите ее 3мя кнопками Ctrl+Shift+Enter (так как массивная) и должна работать.
 У вас скорее всего в настройках стоят русские формулы, нужно будет или снять флажок или перевести функции на русский.


Где-то ошибка, ввожу формулу, и просто пустая строка образуется. Английский поставил в настройках.
Записан
sokol92
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 704


WWW
« Ответ #14: 13 Январь 2022, 18:54 »

Михаил, Игорь, спасибо!

По поводу имени домена. Я бы сначала "честно" извлек бы имя домена из HTTP URI (URL), например, подобным образом. В URI адресах (например, поисковиков) имена доменов вполне могут встретится и в области URL-пути адреса.
« Последнее редактирование: 13 Январь 2022, 19:05 от sokol92 » Записан

Владимир.
Страниц: 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!