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

Откуда:
Сообщений: 9
Есть задача вытащить напрямуй данные из 1с SQL.
Там встречаются столбцы содержащие строки вида, например:

',140030,Московская обл,Люберецкий р-н,,Малаховка п,Касимовское ш,3,Б,'

Можно ли эту строчку как-то элегантно распарсить?
Например, получть на выходе: 'Московская обл, Касимовское ш, 3Б'
Т.е. разложит по разделителю (,), а потом склеить как нужно.

Заранее спасибо!
12 дек 07, 14:13    [5038485]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
PKovalenko
Есть задача вытащить напрямуй данные из 1с SQL.
Там встречаются столбцы содержащие строки вида, например:

',140030,Московская обл,Люберецкий р-н,,Малаховка п,Касимовское ш,3,Б,'

Можно ли эту строчку как-то элегантно распарсить?
Например, получть на выходе: 'Московская обл, Касимовское ш, 3Б'
Т.е. разложит по разделителю (,), а потом склеить как нужно.

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

можно, читайте про строковые функции
12 дек 07, 14:14    [5038500]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Строим заранее кривые структуры, мучаем форум, - потом тягостно проеодолеваем проблемы.
P.S. 1C - всё для людей! :)
12 дек 07, 14:33    [5038649]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
declare @str varchar(1024)
set @str=',140030,Московская обл,Люберецкий р-н,,Малаховка п,Касимовское ш,3,Б,'
select @str='select '''+replace(@str, ',', ''' as val union all select ''')+''''
declare @t table(id int identity, val varchar(100))
insert into @t
exec (@str)
select val from @t where val!='' order by id;

--2005
declare @str2 varchar(1024)
set @str2=',140030,Московская обл,Люберецкий р-н,,Малаховка п,Касимовское ш,3,Б,';
with cte
as
(
select 1 id, convert(varchar(max), @str2) as str, convert(varchar(max), '') val 
union all
select id+1, 
convert(varchar(max), stuff(str, 1, charindex(',', str), '')), 
substring(str, 0,  charindex(',', str))
from cte
where val is not null
)
select val from cte where val!='' order by id
12 дек 07, 14:34    [5038660]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
PKovalenko
Member

Откуда:
Сообщений: 9
Knyazev Alexey
declare @str varchar(1024)
set @str=',140030,Московская обл,Люберецкий р-н,,Малаховка п,Касимовское ш,3,Б,'
select @str='select '''+replace(@str, ',', ''' as val union all select ''')+''''
declare @t table(id int identity, val varchar(100))
insert into @t
exec (@str)
select val from @t where val!='' order by id;


Супер решение.
Собственно так и хотел, но запутался с кавычками.
Спасибо!
12 дек 07, 14:37    [5038684]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Парсинг строки  [new]
PavM
Member

Откуда:
Сообщений: 122
Прошу прощения за некропаст, но не хочется пложить ряд тем

с решением предложенным выше ознакомился, но не могу применить его ксвоей задаче:

есть:
DECLARE @TABLE table (CAT int, CAT_TYPE nvarchar(100))

insert into @TABLE values (1, '101,1002,10003')
insert into @TABLE values (2, '1002,1005,1010')


нужно это получить как-то вроде:
1 101
1 1002
1 10003
2 1002
2 1005
2 1010

Заранее спасибо за любую помощь
19 ноя 10, 20:19    [9810823]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
PavM
Member

Откуда:
Сообщений: 122
Стоит куда-то что-то запостить, как решение само приходит :)

для тех, кто в будущем наткнется на эту тему:

DECLARE @TABLE table (CAT int, CAT_TYPE nvarchar(100))

insert into @TABLE values (1, '1001,1002,1003')
insert into @TABLE values (2, '1001,1005,1010')

declare @str varchar(max)
set @str = ''
select @str=@str+ case when len(@str) = 0 then '' else ' union all ' end +'select ' + cast(cat as NVARCHAR(100)) +' as column1 ,''' + replace(CAT_TYPE, ',', ''' as val union all select ' + cast(cat as NVARCHAR(100)) +',''')+ ''''
FROM @TABLE
19 ноя 10, 20:50    [9810946]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
aleks2
Guest
PavM
Стоит куда-то что-то запостить, как решение само приходит :)

для тех, кто в будущем наткнется на эту тему:

DECLARE @TABLE table (CAT int, CAT_TYPE nvarchar(100))

insert into @TABLE values (1, '1001,1002,1003')
insert into @TABLE values (2, '1001,1005,1010')

declare @str varchar(max)
set @str = ''
select @str=@str+ case when len(@str) = 0 then '' else ' union all ' end +'select ' + cast(cat as NVARCHAR(100)) +' as column1 ,''' + replace(CAT_TYPE, ',', ''' as val union all select ' + cast(cat as NVARCHAR(100)) +',''')+ ''''
FROM @TABLE


Для тех, кто сдуру захочет это поюзать: покурите SQL INJECTION.
Хе-хе.
20 ноя 10, 08:10    [9812376]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
PavM
Стоит куда-то что-то запостить, как решение само приходит :)


это решение не самое лучшее, по ряду причин...помимо озвученной выше, на больших объёма ваш запрос будет отрабатывать ой как долго, как вариант:

select cat, substring( cat_type, i2 + 1, i1 - i2 -1 ) val 
from
(
select cat
     , t1.cat_type
     , charindex( ',', t1.cat_type + ',', number ) i1
     , case when number = 0 then 0 else charindex( ',', t1.cat_type + ',', number - 1 ) end i2
  from @table t1 
    inner join master.dbo.spt_values t2
      on t2.type = 'P' and number between 0 and len( t1.cat_type )
) t where i1 != i2
20 ноя 10, 10:06    [9812443]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Еше простенький вариант для 2005-го и выше:
declare @t table (cat int, cat_type nvarchar(100))

insert into @t values (1, '1001,1002,1003')
insert into @t values (2, '1001,1005,1010')

select cat,v 
from (select cat,cast('<r><c>'+replace(cat_type,',','</c><c>')+'</c></r>' as xml)s from @t)t
cross apply(select x.z.value('.', 'int') v from s.nodes('/r/c') x(z))tt
20 ноя 10, 14:30    [9812935]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Парсинг строки  [new]
PurpleTunes
Member

Откуда:
Сообщений: 2
Ребят, помогите с запросом пожалуйста.
Нужно из столбца FIO в таблице tabl1, перенести в tabl2 в отдельные столбцы fam, im и ot.

В tabl1.FIO данные в формате: Иванов Иван Иванович.
Нужно чтобы было: tabl2.fam - Иванов
tabl2.im - Иван
tabl2.im - Иванович
30 янв 13, 11:32    [13849456]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
PurpleTunes
Ребят, помогите с запросом пожалуйста.
Нужно из столбца FIO в таблице tabl1, перенести в tabl2 в отдельные столбцы fam, im и ot.

В tabl1.FIO данные в формате: Иванов Иван Иванович.
Нужно чтобы было: tabl2.fam - Иванов
tabl2.im - Иван
tabl2.im - Иванович

На всякий тюркоязычные отчетства двойные Иванович оглы. Бывают и двусоставные фамилии. Ни и вообще дофига всякого бывает. А так все приведенные выше примеры работать будут, только разделитель не ',' , а ' '
30 янв 13, 11:56    [13849645]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Кто лучше? (Фамилия Имя Отчество - > Фамилия И. О. )
30 янв 13, 12:40    [13849947]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PurpleTunes
Нужно из столбца FIO в таблице tabl1, перенести в tabl2 в отдельные столбцы fam, im и ot.


declare @names table (id int, fio varchar(100));

insert @names values (1, 'Иванов Иван Иванович оглы');
insert @names values (2, '   Петров-Водкин     Пётр     Петрович    ');
insert @names values (3, 'Бонд    Джеймс');
insert @names values (4, 'Человекбезпробела');
insert @names values (5, '  ');
insert @names values (5, '');
insert @names values (6, null);

select n.id, n.fio,
       case when b.fam_last > a.fam_first then substring(n.fio, a.fam_first, b.fam_last - a.fam_first + 1) else '' end as fam,
       case when d.im_last  > c.im_first  then substring(n.fio, c.im_first,  d.im_last  - c.im_first  + 1) else '' end as im,
       rtrim(ltrim(right(n.fio, n.len_fio - d.im_last))) as ot
from (select id, fio, len(fio) as len_fio from @names) n
     cross apply (select patindex('%[^ ]%', n.fio) as fam_first) a
     cross apply (select isnull(nullif(charindex(' ', n.fio, a.fam_first), 0) - 1, n.len_fio) as fam_last) b
     cross apply (select patindex('%[^ ]%', substring(n.fio, b.fam_last + 1, n.len_fio)) + b.fam_last as im_first) c
     cross apply (select isnull(nullif(charindex(' ', n.fio, c.im_first), 0) - 1, n.len_fio) as im_last) d;
30 янв 13, 12:50    [13850052]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
ой как красииво... лишние пробелы...3987988
+ всего 3 REPLACE
declare @chr char='_'
declare @str varchar(1000)=replicate(@chr, 10)+'b'+replicate(@chr, 15)+'c'+replicate(@chr, 1)+'d'+replicate(@chr, 20)+'e'+replicate(@chr, 30) --  '       b    c d     e     '
SELECT @str str, replace(replace(replace(@str,@chr+@chr,@chr+CHAR(1)), CHAR(1)+@chr,''), CHAR(1),'') f
SELECT @str str, replace(@str,@chr+@chr,@chr+CHAR(1))R1, replace(replace(@str,@chr+@chr,@chr+CHAR(1)), CHAR(1)+@chr,'') R2, replace(replace(replace(@str,@chr+@chr,@chr+CHAR(1)), CHAR(1)+@chr,''), CHAR(1),'') R3
str                                                          f
__________b_______________c_d____________________e__________ _b_c_d_e_

str R1 R2 R3
------------------------------------------------------------ ------------------------------------------------------------ ------------ ---------
__________b_______________c_d____________________e__________ _____b________c_d__________e_____ _b_c_d_e_ _b_c_d_e_
30 янв 13, 13:19    [13850283]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
PurpleTunes
Member

Откуда:
Сообщений: 2
Гость333

declare @names table (id int, fio varchar(100));

insert @names values (1, 'Иванов Иван Иванович оглы');
insert @names values (2, '   Петров-Водкин     Пётр     Петрович    ');
insert @names values (3, 'Бонд    Джеймс');
insert @names values (4, 'Человекбезпробела');
insert @names values (5, '  ');
insert @names values (5, '');
insert @names values (6, null);
......................


Спасибо большое!
31 янв 13, 13:15    [13856441]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 868
Knyazev Alexey
PavM
Стоит куда-то что-то запостить, как решение само приходит :)


это решение не самое лучшее, по ряду причин...помимо озвученной выше, на больших объёма ваш запрос будет отрабатывать ой как долго, как вариант:

select cat, substring( cat_type, i2 + 1, i1 - i2 -1 ) val 
from
(
select cat
     , t1.cat_type
     , charindex( ',', t1.cat_type + ',', number ) i1
     , case when number = 0 then 0 else charindex( ',', t1.cat_type + ',', number - 1 ) end i2
  from @table t1 
    inner join master.dbo.spt_values t2
      on t2.type = 'P' and number between 0 and len( t1.cat_type )
) t where i1 != i2


вариант ещё хорош тем , что использовать его можно в функции. а вот exec нельзя !
15 ноя 13, 10:06    [15133649]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Парсинг строки  [new]
Time_Scream
Member

Откуда:
Сообщений: 5
Здравствуйте! Чтобы не постить новую тему спрошу здесь.

Есть текстовый файл вида
"1111","222222222","33333333","44","55","6";"7777","8888","99","1";11111.11
"2222","3333333","44444444","5","6","77";"8888","8888","11","2";22222.22

Задача распарсить его в таблицу вида

n1,n2,n3,n4,n5,n6,n7
30 окт 15, 12:35    [18348263]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Time_Scream
Задача распарсить его в таблицу вида

Это не распарсить.
Это импортировать.
Для этого для вас специально в студии сделали Import-Export wizard
30 окт 15, 12:37    [18348282]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Time_Scream
Member

Откуда:
Сообщений: 5
По разделителю ; bcp шкой занес а три ячейки m1,m2,m3
А вот дальше, нарезать так как задумано не получается.
Буду признателен любой помощи. Если была такая тема, ткните пальцем, спасибо.
30 окт 15, 12:39    [18348289]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Time_Scream
Буду признателен любой помощи.

Откройте хелп по bcp

Time_Scream
Если была такая тема, ткните пальцем, спасибо.

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

Сообщение было отредактировано: 30 окт 15, 12:43
30 окт 15, 12:43    [18348314]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Time_Scream
Member

Откуда:
Сообщений: 5
Glory,Спасибо, сейчас посмотрю наверное что-то упустил, импортировать-то я смог, по разделителю, а вот нарезать по ячейкам(
30 окт 15, 12:48    [18348341]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Time_Scream
Member

Откуда:
Сообщений: 5
Glory, import/export в wirard мне не подходит, загрузка не разовая, осуществляться будет без моего участия, посредством замены исходного файла
30 окт 15, 13:11    [18348486]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Time_Scream
import/export в wirard мне не подходит, загрузка не разовая,осуществляться будет без моего участия,

Вы хоть до конца визарда дошли, прежде чем такие заявления делать ?
Кнопку "сохранить как пакет" видели ?
30 окт 15, 13:14    [18348515]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4686
Glory
Time_Scream
import/export в wirard мне не подходит, загрузка не разовая,осуществляться будет без моего участия,

Вы хоть до конца визарда дошли, прежде чем такие заявления делать ?
Кнопку "сохранить как пакет" видели ?


Это SSIS. Даже Glory видит в нем пользу в решении таких задач.
30 окт 15, 13:52    [18348812]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить