Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Разделение/анализ переменных данных

    Разделение/анализ переменных данных

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Разделение/анализ переменных данных, RouterOS
     
    upnort
    Guest
    #1
    0
    20.08.2019 16:43:00
    Какой командой можно заменить bash awk или cut? Я нашел функцию “:parse”, но не смог с ней справиться. Когда я выполняю следующую команду: :put [/system resource get version], я вижу что-то вроде: 6.44.5 (долгосрочная). Я хочу получить только номер версии. То есть, использовать пробел в качестве разделителя. Спасибо!
     
     
     
    rextended
    Guest
    #2
    0
    08.11.2023 14:12:00
    { :local test “081234567890|Западная Ява|Джон Дью” :put [:pick $test ( -1 + 1) [:find $test “|” -1] ] :put [:pick $test ( [:find $test “|” -1] + 1) [:find $test “|” [:find $test “|” -1]] ] :put [:pick $test ( [:find $test “|” [:find $test “|” -1]] + 1) [:len $test ] ] }
     
     
     
    diamuxin
    Guest
    #3
    0
    08.11.2023 23:00:00
    Привет, Рекс. Можешь объяснить эту часть скрипта? (Я вижу, что она нужна для получения второго символа “|”, но я не понимаю, как это работает. [:find $test "|" [:find $test "|" -1]] Спасибо.
     
     
     
    rextended
    Guest
    #4
    0
    08.11.2023 23:35:00
    Пробелы не были расставлены случайно… Если [:find $test “|” -1] определяет позицию первого “|” ([:find $test “|” -1] + 1) это следующий символ после |, так что если вы начнете следующий :find с ([:find $test “|” -1] + 1), вы получите следующий “|” и так далее… { :local test “081234567890|West Java|John Due” :put [:pick $test (-1 + 1) [:find $test “|” -1] ] :put [:pick $test ([:find $test “|” -1] + 1) [:find $test “|” [:find $test “|” -1]] ] :put [:pick $test ([:find $test “|” [:find $test “|” -1]] + 1) [:len $test ] ] } так что, если вы добавите еще один элемент: { :local test "081234567890|West Java|John Due|another one" :local s "|" ; # разделитель :put [:pick $test ( -1 + 1) [:find $test $s -1] ] :put [:pick $test ([:find $test $s -1] + 1) [:find $test $s [:find $test $s -1]] ] :put [:pick $test ([:find $test $s [:find $test $s -1]] + 1) [:find $test $s [:find $test $s [:find $test $s -1]]] ] :put [:pick $test ([:find $test $s [:find $test $s [:find $test $s -1]]] + 1) [:len $test ] ] }
     
     
     
    diamuxin
    Guest
    #5
    0
    08.11.2023 23:51:00
    Немного сложно, но с твоим отличным объяснением я понимаю. Спасибо, магистр!
     
     
     
    rextended
    Guest
    #6
    0
    08.11.2023 23:54:00
    Это всего лишь пример для немного сложной строки, если полей больше, то цикл будет лучше...
     
     
     
    diamuxin
    Guest
    #7
    0
    17.11.2023 13:30:00
    Как сделать это без pick? Я пробовал использовать массив, но только "запятая" работает в качестве разделителя между значениями. Вертикальная черта не работает. {
    :local test [:toarray "081234567890|West Java|John Due|Another one|Second item"]
    :put ($test->0)
    :put ($test->1)
    :put ($test->2)
    :put ($test->3)
    :put ($test->4)
    } простите мою неосведомленность. С уважением.
     
     
     
    Amm0
    Guest
    #8
    0
    17.11.2023 14:20:00
    Использование :toarray "трюка" для разбора делимитированной строки не учитывает | как разделитель. Под "циклом" подразумевается цикл :for с :pick и :find внутри... поскольку :toarray на самом деле не является парсером, он просто удобно использует запятую в синтаксисе для определения элементов.
     
     
     
    rextended
    Guest
    #9
    0
    17.11.2023 14:44:00
    Я могу (бесполезно) написать метод, чтобы не использовать pick для разделения строки, но если pick существует, почему бы его не использовать? Чтобы преобразовать x|y|z в массив из 3 элементов, два способа проще: сначала заменить все | внутри строки на запятую, и использовать :toarray или использовать "while", пока не обработаешь строку от начала до конца и не создашь новую строку в массиве для каждого | и последнюю в конце строки.
     
     
     
    pe1chl
    Guest
    #10
    0
    17.11.2023 14:48:00
    Обычно причиной использования разделителя является то, что известно, что этот разделитель не может встречаться в данных. Я часто использую , но в данном случае, судя по всему, был выбран |. Я не хотел бы заменять все | на , а затем использовать :toarray, потому что вполне возможно, что некоторые поля между | могут содержать , в значении, и это приведет к хаосу. Нам действительно нужны функции скриптов, которые могут преобразовать строку в массив, используя пользовательский разделитель или, лучше, регулярные выражения с захватом. В свое время нам обещали библиотеку скриптов с такими полезными функциями…
     
     
     
    Amm0
    Guest
    #11
    0
    17.11.2023 15:05:00
    Я подал запрос на добавление функции в v7.13beta для :serialize и :deserialize, чтобы добавить поддержку "разделенных файлов" (CSV/TSV и т.д.). Хотя новые команды добавляют JSON в бета-версии, они поддерживают from= и to=... Но я согласен, команда :regexp (с захватом/группировкой), которая была бы похожа на sed, была бы полезной и решила бы проблему парсинга строк более универсально.
     
     
     
    rextended
    Guest
    #12
    0
    17.11.2023 16:30:00
    Не просто замени запятую “,” на (например) $$$comma$$$, а когда массив будет создан, верни назад $$$comma$$$ на “,” для каждого элемента.
     
     
     
    diamuxin
    Guest
    #13
    0
    17.11.2023 17:28:00
    Спасибо всем за ваши советы. С уважением.
     
     
     
    diamuxin
    Guest
    #14
    0
    17.11.2023 17:54:00
    Что-то вроде этого, да? {
    :local string "081234567890|Западная Ява|Джон Дью|Еще один|Второй элемент"
    :local reEncoded

    :for i from=0 to=([:len $string] - 1) do={
       :local char [:pick $string $i]
       :if ($char = "|") do={:set $char ","}
       :set reEncoded ($reEncoded . $char)
    }

    :local test [:toarray $reEncoded]
    :put ($test->0)
    :put ($test->1)
    :put ($test->2)
    :put ($test->3)
    :put ($test->4)
    }

    Вывод:
    081234567890
    Западная Ява
    Джон Дью
    Еще один
    Второй элемент. Я адаптировал эту функцию, которую нашел на форуме по скриптам, и она подходит для моих нужд, поэтому делюсь ей. :global strEncode do={
       :local string $1
       :local reEncoded
       :local char
       :if (([:typeof $string] != "str") or ($string = "")) do={
           :return ""
       } else={
           :for i from=0 to=([:len $string] -1) do={
               :set char [:pick $string $i]
               :if ($char = "|") do={:set $char ","}
               :if ($char = "!") do={:set $char ","}
               :set reEncoded ($reEncoded . $char)
           }
           :return $reEncoded
       }
    }

    Используйте:
    :put [$strEncode "081234567890|Западная Ява|Джон Дью|Еще один!Второй элемент"]
    Вывод:
    081234567890,Западная Ява,Джон Дью,Еще один,Второй элемент.
     
     
     
    pe1chl
    Guest
    #15
    0
    17.11.2023 20:33:00
    Помните, что это рецепт для "инъекционных атак", похожих на хорошо известные "SQL-инъекционные атаки", которые так часто используются для взлома веб-сайтов, интернет-магазинов и прочего, а также как использование eval() для быстрого парсинга JSON-данных в JavaScript. Это можно использовать только в том случае, если данные, которые нужно распарсить, полностью надежны, а не в тех случаях, когда есть хоть малейшая возможность того, что посторонний сможет изменить данные, например, через форму или другой способ ввода данных.
     
     
     
    diamuxin
    Guest
    #16
    0
    17.11.2023 22:08:00
    Данные, используемые, предназначены только для учебных целей.
     
     
     
    Raffa2023
    Guest
    #17
    0
    08.11.2023 00:38:00
    Привет всем, мне тоже нужен скрипт для парсинга данных из комментариев в секрете. Например: Комментарий секрет A: 081234567890|Западная Ява|Джон Дью Комментарий секрет B: 08123456789|Восточная Ява|Майкл Джексон Комментарий секрет C: 0812345678901|Центральная Ява|Клара Бернадетт И использовать “|” в качестве разделителя. Как мне извлечь данные о телефоне, адресе и имени, если данные случайные, как в приведенных примерах? Спасибо.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры