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

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

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

mikekaganski

Цитата: sokol92 от 13 января 2022, 18:54Я бы сначала "честно" извлек бы имя домена из HTTP URI (URL), например, подобным образом.

Подобный образ совсем не учитывает кучу особенностей URL - например, относительные URL (кстати, в примере на той странице "google.ru/link" - это относительный URL, а вовсе не домен google.ru); возможность не указывать протокол - только если приложение имеет протокол по умолчанию и обрабатывает некое малое подмножество валидных синтаксисов (браузер - HTTP(S)). Кроме того, не каждый абсолютный URL имеет два прямых слеша после двоеточия.

Но для каких-то целей может быть полезно, и уж тогда проще воспользоваться REGEX.

Цитата: sokol92 от 13 января 2022, 18:54имена доменов вполне могут встретится и в области URL-пути адреса

И более того, они могут быть обфусцированы - например, просто использованием URL-кодирования.
С уважением,
Михаил Каганский

sokol92

#16
Я для разбора URL использую собственную функцию:

' --------------------------------------------------------------------------------------------------------------------------------------
' lang:en
' Parses the URL format string
' - txt string in URL format (URI).
'
' The examples below are given for the string: https://en.wikipedia.org:443/wiki/URL?key1=a&key2=b#URL_structure.
'
' Returns a string array with the following indices:
' 0: "0" - the string was parsed successfully; "1" error.
' 1: scheme. Example: https.
' 2: host (authority). Example: en.wikipedia.org:443.
' 3: path. Example: /wiki/url.
' 4: parameters (query). Example: key1=a&key2=b.
' 5: anchor (fragment). Example: URL_structure.
' lang:ru
' Разбирает строку формата URL
' - txt строка в формате URL (URI).
'
' Примеры ниже даны для строки: https://en.wikipedia.org:443/wiki/URL?key1=a&key2=b#URL_structure.
'
' Возвращает строковый массив со следующими индексами:
' 0: "0" - строка разобрана успешно; "1" - ошибка.
' 1: схема (scheme). Пример: https.
' 2: хост (authority). Пример: ru.wikipedia.org:443.
' 3: путь (path). Пример: /wiki/URL.
' 4: параметры (query). Пример: key1=a&key2=b.
' 5: якорь (fragment). Пример: URL_structure.
Function UrlParse(ByVal txt)
 Dim arr(5) As String
 Const pattern = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" ' из стандарта RFC3986.
 Dim options As new com.sun.star.util.SearchOptions2
 Dim oSearch, result, i As Long, j As Long, n As Long
 Dim arr2
 
 oSearch=CreateUnoService("com.sun.star.util.TextSearch2")
 options.AlgorithmType2=com.sun.star.util.SearchAlgorithms2.REGEXP   ' Regular Exp (=2)
 options.SearchString=pattern
 oSearch.setOptions2 options
 result=oSearch.searchForward(txt, 0, len(txt))
 With result
   n=.subRegExpressions
   If n=0 Then   ' не найдено
     arr(0)="1"
   Else
     arr(0)="0"
     arr2=Array(0,0,1,0,2,3,0,4,0,5)   ' соответствие индексов startOffset и arr
     For i=0 To n-1
       If i<=uBound(arr2) Then
         j=arr2(i)
         If j>0 And .endOffset(i)>.startOffset(i) Then
           arr(j)=mid(txt, .startOffset(i)+1, .endOffset(i) - .startOffset(i))
         End If
       End If
     Next i
   End If
 End With
 
 UrlParse=arr
End Function


Стандартный сервис URLTransformer мне чем-то не подошел - надо поискать чем.
Владимир.

eeigor

#17
Цитата: eeigor от 13 января 2022, 16:23@Mric, а может, так проще будет - с макросом Contains()? Файл прилагается.
Коллеги, мы тут не напугали @Mric, а то он, похоже, не хочет использовать мой пример, хотя он вполне безопасен. :) А автофильтр в LO Calc тоже безопасен, так как, в отличие от MS Excel, позволяет безболезненно удалять отфильтрованные записи, выделяя их связным способом (подряд), не затрагивая скрытых.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

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

eeigor

#19
OFFTOPIC: Расширенный фильтр с вычисляемыми критериями (формулами)
Цитата: eeigor от 12 января 2022, 19:04Кто может подсказать? Относительная ссылка в формуле на первую ячейку диапазона данных (A8) работает только с первой ячейкой, а фильтр должен перебрать все ячейки...
Вопрос разъяснён разработчиком @erAck: не поддерживается. Пока что... К сожалению, с этим отпадает и целый ряд задач, на решение которых способен MS Excel. В LO Calc формула должна вернуть результат в виде константы (литерала) до начала фильтрации. В MS Excel результат вычисляется в процессе фильтрации. В этом вся разница.
Подробности здесь. А прилагаемый там файл XLSX содержит упомянутый "ряд задач". Кто-то всё-таки (но таких мало) спрашивает об этом (ссылка). Тем не менее, вопрос легко решается добавлением вспомогательного столбца к набору данных. Это "исследование" больше носило теоретический характер.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric


Mric


bigor

#22
Цитата: Mric от 14 января 2022, 10:31Вот сам файл
Вы ввели формулу как обычную, нажав Enter, а она массивная вводится нажатием трех кнопок одновременно Ctrl+Shift+Enter
Для исправления переходите в а14, в строкеввода формул появляется формула, удаляете последнюю скобку, затем прописываете ее обратно и жмете Ctrl+Shift+Enter, возвращаемся опять в а14 и смотрим на формулу в строке ввода формул, перед и после нее должны появиться фигурные скобки
ps чтобы прописать ее в нижние ячейки копируем из а14, выделяем нужные ячейки и вставляем.
"протягивание" массивных формул работает некорректно
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#23
@Mric, я обновил файл в ответе #11.
Поиграйте с длиной и доменами (измените текст строки), и увидите, как меняется результат.
Прим. Если, конечно, у Вас подключены макросы.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

#24
Моя формула, при указании доменов не по порядку работает неверно. Пока остается вариант @eeigor

ну или решение по его принципу без udf формулами
=SUM(ISNUMBER(SEARCH($A$2:$A$9;E2))*(LEN(E2)>C$1))
формула массивная
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#25
Можно и так - с использованием простых формул и автофильтра

(Исправил условие - для регистронезависимого поиска и отдельного учёта совпадений и длины)
С уважением,
Михаил Каганский

Mric

Цитата: eeigor от 14 января 2022, 11:41
@Mric, я обновил файл в ответе #11.
Поиграйте с длиной и доменами (измените текст строки), и увидите, как меняется результат.
Прим. Если, конечно, у Вас подключены макросы.

Через раз работает, например, вот: https://i2.piccy.info/i9/dc8eaed246c50538607d88f4a1f14e37/1642168952/163764/1454798/454.png

А если туда запихнуть доменов 500 и 10000 урлов, как долго оно это все обрабатывать будет?

sokol92

Если отсортировать список доменов, то формулы можно написать так, что считать будет мгновенно.
Владимир.

Mric

Цитата: sokol92 от 14 января 2022, 17:15
Если отсортировать список доменов, то формулы можно написать так, что считать будет мгновенно.

Почем их сортировать, если там может домен быть asdfsdfsd.com, ersddfsdf.io и т.д. Или там только с domain считает?

sokol92

Поиск по отсортированному списку намного быстрее, некоторые функции Calc это умеют.
Владимир.