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

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

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

eeigor

Но UDF легко поправить, чтобы она не принимала пустые строки за истину, а продолжала просматривать список далее
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Пусть имеется N адресов URL и M доменов. Сейчас время выполнения O(N*M), плюc существенные накладные расходы на вызов UDF-функций.

Выделение имени домена из URL быстрая операция (так как длина домена ограничена). Если отсортировать список доменов, то время выполнения составит O(N * log(M)), причем всё можно сделать формулами. Но, по-прежнему, нужен максимально приближенный к реальным условиям пример файла, в котором будет, как минимум, несколько сотен доменов и несколько тысяч URL.
Владимир.

bigor

Цитата: sokol92 от 20 января 2022, 13:38максимально приближенный к реальным условиям пример файла
здесь уже доменов и строк больше тысячи
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Можно так (если я вник в задачу). Открывает файл мгновенно.
Владимир.

eeigor

Цитата: Mric от 17 января 2022, 10:13Нет, там может быть как http, так и https и еще прибавляться www.
Владимир, если не ошибаюсь, Вы удалили подстроку "www." из URL. И как писал выше Михаил, это ненадёжно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от 20 января 2022, 16:18Вы удалили подстроку "www." из URL
Все адреса в примере начинаются на http:// или https://. В этих условиях удаление лидирующего "www." оправдано. Другое дело, что авторы формулы это удаление сделали грязновато.
Но это дело поправимое:
=SUBSTITUTE(SUBSTITUTE(LOWER("*" & MID(A2;IFERROR(FIND("//";A2)+2;1);IFERROR(FIND("/";A2;IFERROR(FIND("//";A2)+2;1))-IFERROR(FIND("//";A2)+2;1);LEN(A2))));"*www.";); "*";)

Знак "*" можно заменить на любой символ, который не может встречаться в имени домена.
Владимир.

eeigor

#51
Ну, если интересно, я поправил UDF Contains() и др. формулы на предмет пустых записей. Хотя я считаю, что их не должно быть. Это неоправданное усложнение формул (доп. нагрузка в один лишний критерий).

Например:
   =AND(SUMPRODUCT(LEN(Domains)>0;ISTEXT(REGEX(A12;"(?"&$J$2&")\Q"&Domains&"\E")));(LEN(A12)>=MinLength))

Файл приложен

If Len(data(i, 1)) > 0 Then
If Len(data) > 0 Then

''' Test: Test_Contains
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)
            If Len(data(i, 1)) > 0 Then
                pattern = "*" & data(i, 1) & "*"
                If str Like pattern Then
                    Contains = True
                    Exit For
                End If
            End If
        Next
    Else
        If Len(data) > 0 Then
            pattern = "*" & data & "*"
            Contains = str Like pattern
        End If
    End If
End Function
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 20 января 2022, 17:01
Ну, если интересно, я поправил UDF Contains() и др. формулы на предмет пустых записей. Хотя я считаю, что их не должно быть. Это неоправданное усложнение формул (доп. нагрузка в один лишний критерий).

Например:
    =AND(SUMPRODUCT(LEN(Domains)>0;ISTEXT(REGEX(A12;"(?"&$J$2&")\Q"&Domains&"\E")));(LEN(A12)>=MinLength))

Файл приложен

If Len(data(i, 1)) > 0 Then
If Len(data) > 0 Then

''' Test: Test_Contains
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)
            If Len(data(i, 1)) > 0 Then
                pattern = "*" & data(i, 1) & "*"
                If str Like pattern Then
                    Contains = True
                    Exit For
                End If
            End If
        Next
    Else
        If Len(data) > 0 Then
            pattern = "*" & data & "*"
            Contains = str Like pattern
        End If
    End If
End Function


Спасибо, я все-таки ставлю диапазон постоянно, макрос и так медленно работает, если еще и это проверять, совсем все плохо будет.