powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг строки, замена символа подстроки
8 сообщений из 8, страница 1 из 1
Парсинг строки, замена символа подстроки
    #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
Парсинг строки, замена символа подстроки
    #39387431
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dantong,

Лучше заменить ',"' и ''',' на ' "' и '" ' соответственно (IMHO)
...
Рейтинг: 0 / 0
Парсинг строки, замена символа подстроки
    #39387469
dantong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это не столь важно, просто количество колонок может увеличиваться, и соответственно привязываться к количеству возможных вхождений " " не красиво, код будет огромным)
...
Рейтинг: 0 / 0
Парсинг строки, замена символа подстроки
    #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
Парсинг строки, замена символа подстроки
    #39387482
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
'("[^"]*"

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


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