русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Задача. Правка некачественных данных регулярными выражениями.


Дата добавления: 2015-08-31; просмотров: 628; Нарушение авторских прав


Оператор неаккуратно вводит в поле ввода такие строки:

Комиссия по договору ФД-315/11 за просрочку

Проценты по вкладу ФП 8712 /10

НДС по договору лизинга №ФК 2983/09 по условиям договора

Просрочка по кредиту ФР №812/ 07

С помощью функций работы с регулярными выражениями (regexp) написать запрос, выдающий результат:

ФД 315/11

ФП 8712/10

ФК 2983/09

ФР 812/07

 

При решении задачи используем именованный подзапрос (с помощью оператора WITH) с данными входной виртуальной таблицы.

Приведем одно из возможных решений этой плохо формализованной, но жизненной задачи:

with a as

(select 'комиссия по договору ФД-315/11 за просрочку' str

from dual

union all

select 'проценты по вкладу ФП 8712 /10' str

from dual

union all

select 'НДС по договору лизинга №ФК 2983/09 по условиям договора' str

from dual

union all

select 'просрочка по кредиту ФР №812/ 07' str

from dual)

select a.str,

regexp_substr(a.str, '([Ф]{1}.{1})') || ' ' ||

regexp_substr(a.str, '([[:digit:]]+)') ||

replace(regexp_substr(a.str, '([/]{1}[ ]*[[:digit:]]+)'), ' ')

from a;

Задача. Парсинг строк с помощью регулярных выражений.

Операторы ввели в текстовые поля много данных (см. данные ниже в решении). Вычленить из строк все номера счетов и все даты. Если несколько счетов или дат, то собрать их через запятую. Что-то можно и пропустить, т.к. данные вводились без каких-либо шаблонов.

 

В курсоре z заведены исходные данные. Вывод результата осуществляется в dbms_output. Используются символы табуляции для копирования и просмотра результата в Excel:

 

declare

v_account_numbers_list varchar2(4000);

v_dates_list varchar2(4000);

v_parced_string varchar2(4000);



v_matched_substring varchar2(4000);

begin

for z in (select 'Сч. №#12345 от 22.01.09 страх. Каско а/м Пепелац с 27.01.09 по 26.01.10' str

from dual

union all

select 'Сч. №234567 от 29.01.09 вода, Выдуманный пер.' str

from dual

union all

select 'Сч. №3456 от 12.01.09 аренда за январь, Чатланск.' str

from dual

union all

select 'Сч. №45678900 от 26.01.09 изготовл. печатей и штампов, Пацаково' str

from dual

union all

select 'Сч. №567 от 26.01.09 изготовл. печатей и штампов, отд. орг-ции раб. Чатланск.сети' str

from dual

union all

select 'Под отчет (эцих с гвоздями) проезд. билеты, сл. кц' str

from dual

union all

select 'Сч. №6789 от 26.01.08 изготовл. печатей и штампов, отд. сбора гравицапы' str

from dual

union all

select 'Сч. №7/890123 от 18.02.09 пластилин, Альфа-Центавра' str

from dual

union all

select 'Сч. №890123456 от 31.01.09 комм.услуги (мусор ноябрь-январь, водоснабж. ноябрь-декабрь, газ октябрь-декабрь, землепользование ноябрь-декабрь), Тау-Кита' str

from dual

union all

select 'Сч. №901234 от 28.02.09 услуги охраны за февраль, Плюк' str

from dual

union all

select 'Оплата по дог. №Т-01/2345 от 05.03.09 за аренду с 12.12 по 31.12.08, жёлтые штаны' str

from dual

union all

select 'Оплата по дог. купли-продажи 23/456 а/м от 05.03.09 ку' str

from dual

union all

select 'Реализация а/м кю инв.6441 по дог. 345/678 от 05.03.09' str

from dual

union all

select 'Сч. №4567 от 11.03.09 семинар (малиновые штаны), отд. цветовой дифференциации по штанам' str

from dual

union all

select 'Сч. №56/78901 от 20.02.09 доплата за ремонт принтера, чатлы.' str

from dual

union all

select 'Сл.зап. от 03.03.09 №67-89-01/СЗ госпошлина по иск. заявл. о взыск. с ООО "Скрипач", ООО "Клетка", ООО "Тёплое пальтишко", ООО "Тёплое бельё" задолж. по КД №78/90123 от 13.03.08' str

from dual)

-- цикл по введенным строкам, которые парсятся

loop

-- цикл по поиску номеров счетов

v_account_numbers_list := '';

v_parced_string := z.str;

loop

-- крутим цикл, пока номера счетов удается найти по шаблону в переменную v_matched_substring

v_matched_substring := regexp_substr(v_parced_string, '[№].[^ ]*');

-- накапливаем счета в список v_account_numbers_list

v_account_numbers_list := v_account_numbers_list ||

v_matched_substring || ', ';

-- и убираем их из строки v_parced_string

v_parced_string := replace(v_parced_string, v_matched_substring);

-- когда найти номер счета более не удалось, выходим

exit when v_matched_substring is null;

end loop;

-- цикл по поиску дат

v_dates_list := '';

v_parced_string := z.str;

loop

-- крутим цикл, пока даты удается найти по шаблону в переменную v_matched_substring

v_matched_substring := regexp_substr(v_parced_string,

'(([[:digit:]]{2}[.][[:digit:]]{2}[.][[:digit:]]{2}))|([[:digit:]]{2}[.][[:digit:]]{2})');

-- накапливаем даты в список v_dates_list

v_dates_list := v_dates_list || v_matched_substring || ', ';

-- и убираем их из строки v_parced_string

v_parced_string := replace(v_parced_string, v_matched_substring);

-- когда найти дату более не удалось, выходим

exit when v_matched_substring is null;

end loop;

-- вывод результата через символы табуляции chr(9) для копирования и просмотра в Excel

dbms_output.put_line(z.str || chr(9) ||

rtrim(v_account_numbers_list, ', ') || chr(9) ||

rtrim(v_dates_list, ', '));

end loop;

end;



<== предыдущая лекция | следующая лекция ==>
Переменные в заголовке пакета. | Автономные транзакции.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.189 сек.