оракул, разделенный запятой, строка в кавычках

Я нашел множество подобных вопросов, но ни один из них не подходит мне на 100%. у меня оракул 11г экспресс

у меня есть эта строка

'abcd,123,,defoifcd,"comma, in string",87765,,,hello'

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

на данный момент лучший reg exp это тот

'("[^"]*"|[^,]+)'

но это помещает в конец все пустые данные, используя этот запрос

with test as 
(select 
'abcd,123,,defoifcd,"comma, in string", 87765,,,hello'
str from dual  
)  
select REGEXP_SUBSTR(str, '("[^"]*"|[^,]+)', 1, rownum) split
from test  
connect by level <= length (regexp_replace (str, '("[^"]*"|[^,]+)'))  + 1;

я также попытался заменить пустые данные на ,n/a, чтобы иметь

'abcd,123,n/a,defoifcd,"comma, in string",87765,n/a,n/a,hello'

но regexp_replace заменяет только первое появление пустых данных

select 
regexp_replace('abcd,123,,defoifcd,"comma, in string",87765,,,hello', '(,,)', ',n/a,')
str from dual;  

заранее спасибо!


person pillesoft    schedule 19.05.2016    source источник
comment
Вы уже смотрели это? Это использует замену, а не regexp_replace, чтобы поместить фиктивное значение в...   -  person Alex Poole    schedule 19.05.2016
comment
да, такая замена действительно хорошая идея   -  person pillesoft    schedule 19.05.2016


Ответы (1)


Кажется, это работает и обрабатывает NULL:

SQL> with test as
    (select
    'abcd,123,,defoifcd,"comma, in string", 87765,,,hello'
    str from dual
    )
    select trim('"' from REGEXP_SUBSTR(str, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split
    from test
    connect by level<=length(regexp_replace(str,'".*?"|[^,]*'))+1;

SPLIT
----------------------------------------------------
abcd
123

defoifcd
comma, in string
 87765


hello

9 rows selected.

SQL>

Это сообщение послужило толчком к решению: https://community.oracle.com/thread/528107?tstart=0

person Gary_W    schedule 19.05.2016