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

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

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

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 514


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

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

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

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

имена доменов вполне могут встретится и в области URL-пути адреса

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

С уважением,
Михаил Каганский
sokol92
Опытный пользователь
***
Offline Offline

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


WWW
« Ответ #16: 13 Январь 2022, 19:20 »

Я для разбора 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 мне чем-то не подошел - надо поискать чем.
« Последнее редактирование: 13 Январь 2022, 19:23 от sokol92 » Записан

Владимир.
eeigor
Опытный пользователь
***
Offline Offline

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



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

@Mric, а может, так проще будет - с макросом Contains()? Файл прилагается.
Коллеги, мы тут не напугали @Mric, а то он, похоже, не хочет использовать мой пример, хотя он вполне безопасен. Улыбка А автофильтр в LO Calc тоже безопасен, так как, в отличие от MS Excel, позволяет безболезненно удалять отфильтрованные записи, выделяя их связным способом (подряд), не затрагивая скрытых.
« Последнее редактирование: 13 Январь 2022, 20:13 от eeigor » Записан

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

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


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

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

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

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



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

OFFTOPIC: Расширенный фильтр с вычисляемыми критериями (формулами)
Кто может подсказать? Относительная ссылка в формуле на первую ячейку диапазона данных (A8) работает только с первой ячейкой, а фильтр должен перебрать все ячейки...
Вопрос разъяснён разработчиком @erAck: не поддерживается. Пока что... К сожалению, с этим отпадает и целый ряд задач, на решение которых способен MS Excel. В LO Calc формула должна вернуть результат в виде константы (литерала) до начала фильтрации. В MS Excel результат вычисляется в процессе фильтрации. В этом вся разница.
Подробности здесь. А прилагаемый там файл XLSX содержит упомянутый "ряд задач". Кто-то всё-таки (но таких мало) спрашивает об этом (ссылка). Тем не менее, вопрос легко решается добавлением вспомогательного столбца к набору данных. Это "исследование" больше носило теоретический характер.
« Последнее редактирование: 14 Январь 2022, 00:23 от eeigor » Записан

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

Сообщений: 38


« Ответ #20: 14 Январь 2022, 10:31 »

Вот сам файл.

* file-algo.ods (9.76 Кб - загружено 4 раз.)
Записан
Mric
Участник
**
Offline Offline

Сообщений: 38


« Ответ #21: 14 Январь 2022, 10:48 »

Где-то ошибка,
без Вашего файлика вряд ли кто скажет где и в чем.

Скинул файл выше.
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #22: 14 Январь 2022, 11:24 »

Вот сам файл
Вы ввели формулу как обычную, нажав Enter, а она массивная вводится нажатием трех кнопок одновременно Ctrl+Shift+Enter
Для исправления переходите в а14, в строкеввода формул появляется формула, удаляете последнюю скобку, затем прописываете ее обратно и жмете Ctrl+Shift+Enter, возвращаемся опять в а14 и смотрим на формулу в строке ввода формул, перед и после нее должны появиться фигурные скобки
ps чтобы прописать ее в нижние ячейки копируем из а14, выделяем нужные ячейки и вставляем.
"протягивание" массивных формул работает некорректно
« Последнее редактирование: 14 Январь 2022, 11:28 от Bigor » Записан

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

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



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

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

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

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


« Ответ #24: 14 Январь 2022, 12:16 »

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

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

* formula-urls_1.ods (12.93 Кб - загружено 1 раз.)
« Последнее редактирование: 14 Январь 2022, 12:41 от Bigor » Записан

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 514


« Ответ #25: 14 Январь 2022, 12:45 »

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

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

* FilterURLs.ods (17.72 Кб - загружено 2 раз.)
« Последнее редактирование: 14 Январь 2022, 17:22 от mikekaganski » Записан

С уважением,
Михаил Каганский
Mric
Участник
**
Offline Offline

Сообщений: 38


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

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

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

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

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


WWW
« Ответ #27: 14 Январь 2022, 17:15 »

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

Владимир.
Mric
Участник
**
Offline Offline

Сообщений: 38


« Ответ #28: 14 Январь 2022, 18:09 »

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

Почем их сортировать, если там может домен быть asdfsdfsd.com, ersddfsdf.io и т.д. Или там только с domain считает?
Записан
sokol92
Опытный пользователь
***
Offline Offline

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


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

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

Владимир.
Страниц: « 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!