Этот метод делает 2 прохода по строке. Сначала найдите группу из двойной кавычки, за которой следует запятая, а затем символ, не являющийся двойной кавычкой. Замените их, сославшись на них сокращением их группы, первая группа, '\1'
, отсутствующая двойная кавычка, вторая группа '\2'
. Затем сделайте это снова, но наоборот. Конечно, вы можете вложить вызовы regex_replace и получить один большой уродливый оператор, но просто сделайте его двумя операторами для упрощения обслуживания. Парень, работающий над этим после вас, поблагодарит вас, и это уже достаточно уродливо.
SQL> with orig(str) as (
select '"ES26653","ABCBEVERAGES","861526999728",606.32,"2017-01-26","2017
-01-27","","",77910467,"DOROTHY","","RAPP","14219 PIERCE STREET, APT1","","OMAHA
","NE","68144"'
from dual
),
rpl_first(str) as (
select regexp_replace(str, '(",)([^"])', '\1"\2')
from orig
)
select regexp_replace(str, '([^"])(,")', '\1"\2') fixed_string
from rpl_first;
FIXED_STRING
--------------------------------------------------------------------------------
"ES26653","ABCBEVERAGES","861526999728","606.32","2017-01-26","2017-01-27","",""
,"77910467","DOROTHY","","RAPP","14219 PIERCE STREET, APT1","","OMAHA","NE","681
44"
SQL>
РЕДАКТИРОВАТЬ: изменены регулярные выражения и добавлен третий шаг, чтобы разрешить пустые поля без кавычек для комментария Unoembre. Хороший улов! Также добавлены дополнительные тестовые случаи. Всегда ожидайте неожиданного и обязательно добавляйте тестовые примеры для всех комбинаций данных.
SQL> with orig(str) as (
select '"ES26653","ABCBEVERAGES","861526999728",606.32,"2017-01-26","2
017-01-27","","",77910467,"DOROTHY","","RAPP","14219 PIERCE STREET, APT1","","OM
AHA","NE","68144"'
from dual union
select 'ES26653,"ABCBEVERAGES","861526999728"' from dual union
select '"ES26653","ABCBEVERAGES",861526999728' from dual union
select '1S26653,"ABCBEVERAGES",861526999728' from dual union
select '"ES26653",,861526999728' from dual
),
rpl_empty(str) as (
select regexp_replace(str, ',,', ',"",')
from orig
),
rpl_first(str) as (
select regexp_replace(str, '(",|^)([^"])', '\1"\2')
from rpl_empty
)
select regexp_replace(str, '([^"])(,"|$)', '\1"\2') fixed_string
from rpl_first;
FIXED_STRING
--------------------------------------------------------------------------------
"ES26653","ABCBEVERAGES","861526999728","606.32","2017-01-26","2017-01-27","",""
,"77910467","DOROTHY","","RAPP","14219 PIERCE STREET, APT1","","OMAHA","NE","681
44"
"ES26653","ABCBEVERAGES","861526999728"
"ES26653","","861526999728"
"1S26653","ABCBEVERAGES","861526999728"
"ES26653","ABCBEVERAGES","861526999728"
SQL>
person
Gary_W
schedule
14.04.2017