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

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

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

Mric

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

bigor

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


eeigor

#3
Попробуйте применить расширенный фильтр. Добавлен вспомогательный столбец 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: В руководстве эта тема (критерии фильтра с формулами) не освещена.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

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

Или наоборот:
=((ISNA(REGEX(A8;"domain[1-4]\.com")))+(LEN(A8)<40)>0)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

#5
В качестве примера я ждал 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)));"")

Цитата: eeigor от 12 января 2022, 21:21
"domain[1-4]\.com"
а потом окажется, что это для примера, такие имена доменов, а по факту zxcert.com и adsfjutd.ru
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Mric

Цитата: Bigor от 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)));"")

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

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

bigor

Цитата: Mric от 13 января 2022, 11:07привязка будет ко всей строке
мой вариант из #5 ищет совпадения по любой строке
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Mric

Цитата: Bigor от 13 января 2022, 11:11
Цитата: Mric от 13 января 2022, 11:07привязка будет ко всей строке
мой вариант из #5 ищет совпадения по любой строке


Спасибо большое)

Mric

Цитата: Bigor от 13 января 2022, 08:46=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

#10
=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 (так как массивная) и должна работать.
У вас скорее всего в настройках стоят русские формулы, нужно будет или снять флажок или перевести функции на русский.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#11
@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
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 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

Спасибо!

Mric

Цитата: Bigor от 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 (так как массивная) и должна работать.
У вас скорее всего в настройках стоят русские формулы, нужно будет или снять флажок или перевести функции на русский.


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

sokol92

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

По поводу имени домена. Я бы сначала "честно" извлек бы имя домена из HTTP URI (URL), например, подобным образом. В URI адресах (например, поисковиков) имена доменов вполне могут встретится и в области URL-пути адреса.
Владимир.