На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Вопрос по regexp_replace , Oracle 12 PL/SQL
      Всем здравствуйте!
      Если кому интересно - ноги растут отсюда Можно ли расчистить помойку только средствами PL/SQL?.
      А проблема вот в чём - есть строки вида бла-бла-бла;Доп. источ.названия:ZZПостановление № ...; дополн.ист.названZZУказ № ...;бла-бла-бла.
      Заголовок может кончаться двоеточием, перед названием документа могут стоять 2 символа Z (раньше там были CR/LF если что).
      Пытаюсь заменить "стандартные" заголовки на <NAME>:
      ExpandedWrap disabled
        select regexp_replace('бла-бла-бла;Доп. источ.названия:ZZПостановление № ...; дополн.ист.названZZУказ № ...;бла-бла-бла', 'доп(.*?)(назв)(.*?){0,5}?(:)?(ZZ)', '<NAME>', 1, 0, 'i') as res from dual

      С двоеточием разобрался - ( : ) ? . -- если БЕЗ пробелов - то вылезет смайлик.
      А с двойным Z сломал мозг :wall: ! Третий час пляшу с бубном... :wall:
      На что у меня ума не хватает?
      Сообщение отредактировано: #SI# -
        Что сделать-то с этой строкой хочешь?
        '(текст)' если не надо превращать в группу, можно заменить на '(?:текст)', иногда без этого трудно разобраться
        Если ZZ могут стоять, а могут не стоять напиши '(?:ZZ)?'
        Если перед ZZ может стоять ещё и пробел ' ?(:?ZZ)'?
        Если перед ZZ может стоять двоеточие и/или пробел ':? ?(:?ZZ)'?
        Если перед ZZ может стоять двоеточие и пробел или ничего '(?:: )?(:?ZZ)'?
        Если надо выделить в группу текст, стоящий перед ZZ, исключив из него концевые пробелы '(.+?) *(:?ZZ)'
        Если надо проверить, что какой-то текст повторяется несколько раз можно написать '(abc).+\1'. Например '^(.+)\1$' соответствует строке, состоящей из двух одинаковых половинок.
        Так же может сработать RE с именованной группой '(P<name>.*)(P=name)'. В таком случае в строке замены на такую группу можно сослаться как '\q<name>'

        Вообще при помощи одних только регулярных выражений можно сделать почти всё, вплоть до реализации какой-нибудь арифметики. Просто может понадобиться последовательно применять несколько RE.
        Сообщение отредактировано: amk -
          Цитата amk @
          Что сделать-то с этой строкой хочешь?

          Вот тут - варианты "стандартного" заголовка:
          Скрытый текст
          Дополнительные источники нормализованного названия
          дополнительные источники нормализованного названия
          Дополнительные источники норм. названия
          Дополнительные источники норм.названия
          дополнительные источники норм. названия
          дополнительные источники норм.названия
          Дополнительные норм.названия
          Дополнительные источники названия
          Дополн. источники норм. названия
          Доп источники нормализованного названия
          Доп. источники норм. названия
          Доп.источники норм. названия
          Доп. источники норм.названия
          Доп.источника норм.названия
          Доп.источники норм.названия
          Доп источники норм. названия
          Доп. источники нором. названия
          Доп. источники норм. анзвания
          Доп. источники норм. нозвания
          Доп. источники норм. Названия
          Доп.источники норм. Названия
          доп.источники норм названия
          доп.источники норм. названия
          Доп.источники нрм.названия
          Доп.источники норм.названия;
          Доп.источникинорм. названия
          Доп. И;сточники норм. названия
          Доп.источники норм. Названия;
          Доп. норм. названия
          Доп. Источник;и норм. названия
          Доп. Источники; норм. названия
          Доп. источники норм. значения
          Доп.источеики ном. названия
          Доп.Я норм. названия
          Доп.источники нормал. названия
          Доп.ир норм. названия
          Доп.источники но;1998;звания
          Доп. Источники норм. yазвания
          Доп. источники норм. yазвания
          Доп. Источники норм.yазвания
          Доп. Источники норм. названия
          Доп. источники норм названия
          Доп.источ;ики норм. названия
          Доп. Ист; очники норм. названия
          Доп.источники нрм. названия
          Доп.источники. названия
          Доп.источн;ки норм. названия
          Доп.источнки норм. названия
          Доп.источнии норм. названия
          Доп.источник норм. названия
          Доп.истоники норм. названия
          Доп.источники норм названия
          Доп. Источники норм. названия
          Доп. источники норм. навания
          Доп.источник норм. названия
          Доп.ис; то;m ,чники норм. названия
          Доп. сточники норм. названия
          Доп .источники норм. названия
          Доп. источники норм. Названия
          Доп.иточники норм. названия
          Доп.источнки норм. названия
          Доп.истоники норм. названия
          Доп.источни норм. названия
          Доп.источнки норм. названия
          Доп.источнии норм. названия
          доп. источники норм. названия
          Доп.источнии норм. названия
          Доп.истчники норм. названия
          Доп.источники ро. названия
          Доп.источники нор. названия
          Доп.источник норм. названия
          Доп. иcточники норм. названия
          Доп.и сточники норм. названия
          доп.источники норм. Названия
          доп.источники норм.названия
          Доп.и сточники норм. названия
          Доп. источник нормативного названия
          Доп источники норм названия
          Доп.ист.норм.названия
          Доп. источники норм. навания

          Доп. источники норм. назван
          Доп.источники норм. названи
          Доп. источники норм. названи
          Доп.источники норм. названи
          Доп.источники норм. названий
          Доп.источники норм. название
          Доп. источники норм. названиz
          Доп. источники норм. назв

          Доп.источники норм.
          Доп. источники норм.
          Доп.источники норм
          Доп. источники норм
          Доп.источники норм

          Доп. Ист. н. н.
          Доп.источники норм. ир

          Дополнительные источ
          Доп.источники
          Доп. источники
          Доп.ист

          Дп.источники норм. названия
          Д.источники норм. названия

          Количество записей ~800 000. Кроме Доп.источников есть ещё Варианты типа объекта и ещё много чего. И всё это в одной помойке под названием Комментарии к объекту. А я хочу эту помойку разгрести в соответствующие новые поля в таблицах. Понятно, что без окончательного ручного редактирования ничего не выйдет, но основной объём таки можно растащить по ключевым словам (заголовкам).
            Я так понял, это что-то типа перечня оборудования или чего-то подобного. Записи вносили разные люди, и каждый сокращал надпись, как бог на душу положит. И ты хочешь это дело как-то стандартизовать, чтобы неразбериху уменьшить.

            Обычно мысль как-то стандартизовать используемые сокращения приходит, когда БД приходит в описанное тобой состояние, у нас на работе так в материальной группе с БД материалов произошло, из-за чего один и тот же материал одного производителя иногда под несколькими названиями в БД присутствует, а там периодически цены и другие данные меняются. У нас для этого пришлось структуру БД менять, и не уверен, что с такой практикой справились (сейчас я с ними мало контактирую).

            Но ты не ответил, что именно хочешь сделать с приведённой ранее записью. В чём собственно состоит проблема.

            Добавлено
            Я как-то мало работал с собственно БД (только организовывал бэкапы) и пару раз помогал извлечь нужную информацию из готового отчёта (каждый раз это была срочная разовая работа, так что создавать новый отчёт резона не было). Так что я скорее всего просто извлёк бы информацию сперва в текстовый файл, а потом смотрел бы, что с этими записями можно сделать.
              Цитата amk @
              Так что я скорее всего просто извлёк бы информацию сперва в текстовый файл, а потом смотрел бы, что с этими записями можно сделать.

              Еще в начале декабря я такое уже посоветовал. В результате "получил по щям", за то что мешаю прогать на SQL-е :lol: Легкие пути ищут только слабаки, как я понял :lol:
                Цитата amk @
                ты не ответил, что именно хочешь сделать с приведённой ранее записью
                Эти 800 000 записей хочу разобрать по полочкам. Источники - в своё поле, варианты - в своё и т.п.
                Цитата JoeUser @
                Еще в начале декабря я такое уже посоветовал
                Щяс ещё раз получишь - иди и перечитай ЧТО я просил и ЧТО ты :whistle: мне посоветовал.
                ЗЫ - в следующий раз ссылайся на сюда. Тут - по делу.

                Добавлено
                Цитата amk @
                это что-то типа перечня оборудования или чего-то подобного
                Это Федеральный каталог названий географических объектов. Клепали его 15 лет пара десятков контор, потом слили до кучи. Разработчиков уже нет в живых.

                Добавлено
                Цитата amk @
                я скорее всего просто извлёк бы информацию сперва в текстовый файл
                Понятно, что не видя всего этого кошмара, трудно дать чёткий совет.
                Что я измыслил - создал поле в таблице, тупо копирую в него комментарии, чтобы не трогать то, что есть, и потом работаю уже с этим полем. Для начала все "стандартные заголовки" хочу заменить на фразы типа <NAME>, <KIND>, <TRANSLATE> etc... А затем выбирать фрагменты например от <NAME> до следующего символа < и писать их в соответствующее новое поле. Специфика информации такова, что в ней этих символов нет (таки можно проверить, ЧТО за этим символом).
                Сообщение отредактировано: #SI# -
                  Цитата #SI# @
                  ЗЫ - в следующий раз ссылайся на сюда. Тут - по делу.

                  :popcorn:
                    Цитата #SI# @
                    создал поле в таблице, тупо копирую в него комментарии, чтобы не трогать то, что есть, и потом работаю уже с этим полем
                    На самом деле я вытащил бы это всё в текстовый файл не поэтому. В таблице БД лучше всё сделать за один проход. Но сразу сформировать нужный набор регулярок вряд ли удастся. С текстовым файлом я могу многократно обрабатывать весь набор не боясь, что я что-нибудь испорчу.
                    Скорее всего я бы сделал так.
                    Отловил какое-то количество записей и разобрал их. Те записи, которые не удалось обработать вывел в отдельный файл.
                    Посмотрел их, изменил процедуру обработки. Снова вывел в отдельный файл то, с чем процедура не справилась.
                    И так пока процедура наконец не обработает весь набор.

                    Просто в тексте я сразу вижу много записей, могу их как-то сортировать, чтобы обобщать. Иначе всё сведётся к отдельному действию для каждой строки, что не намного лучше ручной обработки.
                      Цитата amk @
                      Те записи, которые не удалось обработать вывел в отдельный файл.
                      Это операторы ручками доправят. Особенно с учётом специфики. Мне в неё лезть - только время терять. Мне проще дать им утилитку, которая будет выдавать на гора записи с э-э-э сомнительной (по моему мнению) информацией. А ~95% можно раскрутить регулярками. Та сотня вариантов (в спойлере) сводится где-то к 5-6 шаблонам.
                      Цитата amk @
                      С текстовым файлом я могу многократно обрабатывать весь набор не боясь, что я что-нибудь испорчу
                      Именно поэтому я сначала копирую в новую колонку и разбираю именно её, а не сами комментарии.

                      Добавлено
                      JoeUser, жуй-жуй! Глотай! :D

                      Добавлено
                      Цитата amk @
                      Просто в тексте я сразу вижу много записей
                      В гриде я из все вижу. Более того - могу видеть и обработанные данные в новой колонке и исходные в старой. И отселектить по любому критерию.
                        Получается :D
                        user posted image
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0513 ]   [ 16 queries used ]   [ Generated: 28.03.24, 23:49 GMT ]