Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нетривиальный парсинг строки  [new]
temoxa
Member

Откуда:
Сообщений: 405
Всем привет! Подскажите путь как можно из большой строки (текст процедуры) вытянуть тесты создания временных таблиц, например вот такая сторока:

DECLARE @text varchar(max)
SET @text = '-- 3) Create storage for products that need to be updated/inserted
CREATE TABLE #ProductsForUpd_Ins(
ID VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT null,
Operation CHAR(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
PRIMARY KEY CLUSTERED (ID)
)

-- 4) Find candidates for INSERT

Из этой строки нужно вытянуть:

CREATE TABLE #ProductsForUpd_Ins(
ID VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT null,
Operation CHAR(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
PRIMARY KEY CLUSTERED (ID)
)

С началом все понятно, с помощью SUBSTRING и CHARINDEX вытягиваем, в вот как быть с конечным символом, так как к примеру закрывающаяся скобка повторяется много раз... Спасибо!
15 июл 14, 12:16    [16305843]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Нарисовать свой парсер с патерном.. выберать все между "главными скобками" или писать считалку открытых\закрытых
15 июл 14, 12:25    [16305911]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
temoxa
Member

Откуда:
Сообщений: 405
Maxx, а как можно определить "главные скорбки"? Спасибо.
15 июл 14, 12:30    [16305954]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
temoxa
Maxx, а как можно определить "главные скорбки"? Спасибо.

так ето ваша задача как минимум :))
Первую понятно - ето первая скобка после команды create table в вашем случае - последняя..надо составить словарик возможных комбинаций того,что у вас идет после создания таблицы - там коментария,след команда и все такое.. вообще вам словарик языка поможет разделять команды.. вообще откровенно задача не на 5 минут подумать..если честно,нужно почти свой синтаксический анализатор написать.
15 июл 14, 12:37    [16306015]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
temoxa
Member

Откуда:
Сообщений: 405
Maxx, спасибо!
15 июл 14, 12:40    [16306037]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
и если савсем честно яб смотрел в второну реализации на CLR
15 июл 14, 12:42    [16306049]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
_human
Member

Откуда:
Сообщений: 560
temoxa,
1
2
+ поищите еще на форуме.
15 июл 14, 12:43    [16306062]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Элементарно, Ватсон! ©
SELECT SUBSTRING(@text,1+LB.P-CHARINDEX('ETAERC',REVERSE(LEFT(@text,LB.P-1)))-LEN('CREATE'),CHARINDEX('ETAERC',REVERSE(LEFT(@text,LB.P-1)))+LEN('CREATE')-1)+T.S
FROM
(SELECT CHARINDEX('(',@text,CHARINDEX('CREATE TABLE #',@text))) LB(P)
CROSS APPLY
(
 SELECT SUBSTRING(@text,LB.P,v.number-LB.P+1)
 FROM master.dbo.spt_values v
 WHERE v.type='P' AND v.number>LB.P AND v.number<LEN(@text) AND SUBSTRING(@text,v.number,1)=')'
   AND LEN(REPLACE(SUBSTRING(@text,LB.P+1,v.number-LB.P-1),'(',''))
     = LEN(REPLACE(SUBSTRING(@text,LB.P+1,v.number-LB.P-1),')',''))
)T(S);
Только если внутри будут комментарии, а в комментавриях - круглые скобки, то никаких гарантий!
15 июл 14, 13:22    [16306382]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
Элементарно, Ватсон! ©
И ещё. Предполагается, что "CREATE TABLE #" разделены одиночными пробелами
15 июл 14, 13:25    [16306397]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
iap
Элементарно, Ватсон! ©
И ещё. Предполагается, что "CREATE TABLE #" разделены одиночными пробелами
Последние 2 замечания:
1. CROSS APPLY - только для небольшого сокращения текста (можно и выбросить)
2. вместо master.dbo.spt_values лучше использовать свою специальную таблицу с числами
15 июл 14, 13:28    [16306426]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap,

+3 регитронезависимый коллейшн :)
15 июл 14, 13:39    [16306510]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный парсинг строки  [new]
temoxa
Member

Откуда:
Сообщений: 405
iap, Респект!) Огромное спасибо!
15 июл 14, 16:05    [16307597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить