Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг строки, замена символа подстроки / 8 сообщений из 8, страница 1 из 1
19.01.2017, 10:31
    #39387404
dantong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
Доброго времени суток.

Помогите решить задачу:

Необходимо разбить строку вида 1308,"18402,6",2,"1,29,35,87,99",3,1
на колонки по разделителю - ,
НО значения в " необходимо считать одним целым.

На выходе нужно получить:

1308 "18402,6" 2 "1,29,35,87,99" 3 1


Была идея вначале заменить все запятые в подстроке на ~, получилось бы 1308,"18402~6",2,"1~29~35~87~99",3,1, а затем по разделителю распарить - regexp_substr(str2, '[^,]+', 1, 1) , regexp_substr(str2, '[^,]+', 1, 2), .......

Буду очень признателен за помощь.
...
Рейтинг: 0 / 0
19.01.2017, 10:47
    #39387431
efendi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
dantong,

Лучше заменить ',"' и ''',' на ' "' и '" ' соответственно (IMHO)
...
Рейтинг: 0 / 0
19.01.2017, 11:14
    #39387469
dantong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
это не столь важно, просто количество колонок может увеличиваться, и соответственно привязываться к количеству возможных вхождений " " не красиво, код будет огромным)
...
Рейтинг: 0 / 0
19.01.2017, 11:15
    #39387470
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with s as (select '1308,"18402,6", " ", "", 2,"1,29,35,87,99",3,1' str from dual)
select ltrim(regexp_substr(str, '("[^"]*"|(,| |^)[^", ]+)', 1, level), ' ,') sub
from s
connect by level <= regexp_count(str, '("[^"]*"|(,| |^)[^", ]+)');

SUB
----------------------------------------------
1308
"18402,6"
" "
""
2
"1,29,35,87,99"
3
1

8 rows selected.
...
Рейтинг: 0 / 0
19.01.2017, 11:34
    #39387482
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
AmKad
Код: plsql
1.
'("[^"]*"

Магия данных .
...
Рейтинг: 0 / 0
19.01.2017, 11:52
    #39387503
dantong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
AmKad,
Для одной строки, данное решение подходит. Но для набора данных уже не отрабатывает:


with s as (select '1308,"18402,6", " ", "", 2,"1,29,35,87,99",3,1' str from dual
union all select '3,"18402,6", " ", "", 2,"1,29,35,87,99",3,1' str from dual
)
select ltrim(regexp_substr(str, '("[^"]*"|(,| |^)[^", ]+)', 1, level), ' ,') sub
from s
connect by level <= regexp_count(str, '("[^"]*"|(,| |^)[^", ]+)');
...
Рейтинг: 0 / 0
19.01.2017, 11:59
    #39387509
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
dantongНо для набора данных уже не отрабатываетТы не умеешь его готовить.
Код: plsql
1.
2.
3.
4.
5.
6.
with s as (select '1308,"18402,6", " ", "", 2,"1,29,35,87,99",3,1' str from dual
union all select '3,"18402,6", " ", "", 2,"1,29,35,87,99",3,1' str from dual
)
select str, level, ltrim(regexp_substr(str, '("[^"]*"|(,| |^)[^", ]+)', 1, level), ' ,') sub
from s
connect by level <= regexp_count(str, '("[^"]*"|(,| |^)[^", ]+)') and prior str = str and prior dbms_random.value is not null;
...
Рейтинг: 0 / 0
19.01.2017, 12:08
    #39387515
dantong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки, замена символа подстроки
AmKad,

Супер.


сделал вот так:

with s as (
select '1,,1308,"18402,6","","",2,"1,29,35,87,99",3,1' str from dual
union all select '3,"18402,6","","",2,"1,29,35,87,99",3,1' str from dual
)
select
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 1), ' ,'),'"','') col_1,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 2), ' ,'),'"','') col_2,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 3), ' ,'),'"','') col_3,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 4), ' ,'),'"','') col_4,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 5), ' ,'),'"','') col_5,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 6), ' ,'),'"','') col_6,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 7), ' ,'),'"','') col_7,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 8), ' ,'),'"','') col_8,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 9), ' ,'),'"','') col_9,
replace(ltrim(regexp_substr(replace(str,',,',',"",'),'("[^"]*"|(,| |^)[^", ]+)', 1, 10), ' ,'),'"','') col_10
from s;

Спасибо за регулярку, я что-то долго тупил над ней)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг строки, замена символа подстроки / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]