regexp_substr — извлечение чисел в многострочный текст

У меня есть строка в таблице оракула, как показано ниже. Мне нужно извлечь сумму после текста «Ежемесячная сумма налога (налоги на имущество):». Каждый элемент находится в новой строке, и сумма, соответствующая элементу, указана в той же строке рядом с описанием. Я без особого успеха пытался разработать некоторую функцию regexp_substr. Пожалуйста, помогите решить это.

"New-Escrowed Payment Quote:
Effective Date(Projected - Good Through) = 07/07/2017
Current Escrow Balance : $-20000.25
Escrow Disbursements During Trial : $5691.06
Anticipated Balance(Projected Escrow Advance) : $-28481.31                    
Monthly Tax Amount(Property Taxes) : $548.51                                                       Monthly Insurance Amount (Hazard Insurance): $97.33
"Monthly PMI / MI Amount(Mortgage Insurance)    : $0"

person Sini K    schedule 21.09.2017    source источник
comment
что вы пробовали и каковы результаты? Обновите исходный пост. Вы хотели включить знак доллара?   -  person Gary_W    schedule 22.09.2017


Ответы (2)


Попробуйте что-то вроде этого:

SELECT REGEXP_SUBSTR('New-Escrowed Payment Quote: Effective Date(Projected - Good Through) = 07/07/2017 Current Escrow Balance : $-20000.25 Escrow Disbursements During Trial : $5691.06 Anticipated Balance(Projected Escrow Advance) : $-28481.31
Monthly Tax Amount(Property Taxes) : $548.51 Monthly Insurance Amount (Hazard Insurance): $97.33 "Monthly PMI / MI Amount(Mortgage Insurance) : $0',
'(Monthly Tax Amount\(Property Taxes\) : \$)([0-9\.]+)',1,1,'i',2) s FROM dual

Это использует регулярное выражение с 2 группами:

  • (Ежемесячная сумма налога (налоги на имущество): \$) -- Первая представляет собой название суммы.
  • ([0-9.]+) -- Второй представляет собой сумму, которую вы хотите получить

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

person pablomatico    schedule 22.09.2017
comment
Замечательно ! Решение сработало. Спасибо за быструю помощь, а также за объяснение того, как это работает. - person Sini K; 22.09.2017
comment
Можете ли вы также помочь мне с извлечением каждого из компонентов? в приведенном выше тексте. Я имею в виду извлечение каждой из сумм рядом с каждым элементом? - person Sini K; 22.09.2017
comment
Вам просто нужно изменить заголовок суммы в регулярном выражении. Если в нем есть круглые скобки, убедитесь, что вы поставили \ перед ними. Например: (Ежемесячная страховая сумма (страхование рисков): \$)([0-9\.]+), (Депозитные выплаты во время пробного периода: \$)([0-9\.]+) и так далее. .. - person pablomatico; 25.09.2017
comment
Мне удалось внести небольшие изменения и извлечь суммы по всем пунктам. Спасибо еще раз. - person Sini K; 29.09.2017

Я не использую много регулярных выражений, но другое решение будет примерно таким, как показано ниже. Возможно, вам придется адаптировать окончания строк chr(10), chr(13) в зависимости от того, какое окончание строки вы используете (unix, windows).

declare

v_string varchar2(32000) default 'New-Escrowed Payment Quote: Effective Date(Projected - Good Through) = 07/07/2017
        Current Escrow Balance : $-20000.25
        Escrow Disbursements During Trial : $5691.06
        Anticipated Balance(Projected Escrow Advance) : $-28481.31
        Monthly Tax Amount(Property Taxes) : $548.51
        Monthly Insurance Amount (Hazard Insurance): $97.33
        Monthly PMI / MI Amount(Mortgage Insurance) : $0';

v_output varchar2(30) default null;

begin

select substr(v_string, instr(v_string, 'Taxes)')+ 9, (instr(v_string, chr(10), instr(v_string, 'Taxes)'))) - instr(v_string, 'Taxes)')) into v_output from dual;

dbms_output.put_line(v_output);

end;
person Shaun Peterson    schedule 21.09.2017