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

Откуда:
Сообщений: 734
Ситуация такая.
Импортируются xls таблицы в MS SQL - некие списки.
В одном из полей прописаны некие коды, например 1.1.2\1.25.1\3.4
где '\' - символ-разделитель кодов.
Но вот проблема в том, что эти списки могут присылать кто во что горазд и вместо символа '\' может оказаться любой другой (пробел, запятая и т.д.).
Считается, что в пределах импортированных данных символ-разделитель будет один какой-то конкретный.

Необходимо после импорта просмотреть все записи из этого поля и определить символы-разделители, то есть любые символы, кроме цифр 0..9 и знака '.'Все остальные символы надо выдать в SELECT в виде символ, количество_раз_сколько_встречается
на тот случай, если списки подадут где с запятой, где с пробелом или еще с чем.
(Нужно для того, чтобы перед анализом) все эти символы-разделители поместить в комбо-бокс и предложить пользователю самому выбрать символ разделителя (по умолчанию будет тот, что встречается чаще всего, поэтому и нужно сколько раз встречается, чтобы отфильтровать по этому значениюв комбобоксе).
13 май 13, 11:30    [14286458]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
nerv, задачка творческая, без уточнений тут вряд ли можно что посоветовать, в ms sql есть replace() - попробуйте с его помощью.
13 май 13, 11:48    [14286607]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
nerv
Member

Откуда:
Сообщений: 734
Александр52, каких уточнений?
13 май 13, 11:52    [14286636]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
Glory
Member

Откуда:
Сообщений: 104751
nerv
Необходимо после импорта просмотреть все записи из этого поля и определить символы-разделители, то есть любые символы, кроме цифр 0..9 и знака '.'Все остальные символы надо выдать в SELECT в виде символ, количество_раз_сколько_встречается
на тот случай, если списки подадут где с запятой, где с пробелом или еще с чем.

И в чем проблема ?
Распарсить строку на символы ?
Посчитать число симолов по результату парсинга ?
13 май 13, 11:58    [14286682]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
nerv
Member

Откуда:
Сообщений: 734
Glory,
строк не одна а несколько (заранее не известно) - курсором делать?
и как то исключить символы 0..9 и точку надо.
13 май 13, 12:00    [14286691]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
qwerty112
Guest
nerv,

а "административно" решить вашу задачу не пробовали ?

"набить морду" поговорить с составителями "неких списков", имхо, проще,
чем "угадывать" какой разделитель он выбирет в след.раз ... - "дурак", он - не предсказуем ... :)
13 май 13, 12:02    [14286703]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
Glory
Member

Откуда:
Сообщений: 104751
nerv
строк не одна а несколько (заранее не известно) - курсором делать?

Может apply join-ом, если версия позволяет
nerv
и как то исключить символы 0..9 и точку надо.

Хм. В функции парсинга произвести сравнение текущего символа и в зависимости от результата произвести те или иные действия ?
13 май 13, 12:02    [14286704]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
declare @t table (i int identity primary key, s varchar(30));

insert into @t
values
 ('1.1.2\1.25.1\3.4'), ('1.1.2,1.25.1,3.4');
 
select
 t.s, substring(t.s, d.p, 1)
from
 @t t cross apply
 (select nullif(patindex('%[^.0-9]%', t.s), 0)) d(p)
13 май 13, 12:16    [14286813]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
nerv
Member

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

как вариант, спасибо. На SQL 2008 работает (другого под рукой нет, интесует совместимость 2005 - обязательна, 2000 - желательно)
Только вот если в одной строке будут два разделителя, например
('1.1.2,1.25.1;3.4');
то в выборку попадет только первый (
13 май 13, 12:47    [14287076]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
Glory
Member

Откуда:
Сообщений: 104751
Не проще ли предложить пользователю список всех _разрешенных_ разделителей ?
Если уж он отвечает за результат импорта
13 май 13, 12:55    [14287162]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
+
declare @t table (i int identity primary key, s varchar(30));

insert into @t
Select
'1.1.2\1.25.1\3.4'
union all 
select
'1.1.2,1.25.1,3.4'
union all 
select
'6.54./.44.77/..14\'
union all 
select
'1. 35.248.'


select delimeter, count(*)
from
(
select substring(t.s,n.number,1) as delimeter
from Master..spt_values n inner join @t t on n.number<=len(s)
where n.type='P' and n.number>0
and substring(t.s,n.number,1) like '[^.0-9]'
) 
as t1
group by delimeter
order by count(*) desc

Как то так, можно попробовать, если количество записей не большое
13 май 13, 13:02    [14287212]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
nerv
Только вот если в одной строке будут два разделителя, например
('1.1.2,1.25.1;3.4');
И что в этом случае должен выбрать пользователь? И как это соотносится с
nerv
Считается, что в пределах импортированных данных символ-разделитель будет один какой-то конкретный.
?

ЗЫ: Пишите табличную CLR-функцию-обертку для Regex.Split и вся станет тривиально:
select * from RegexSplit('1.1.2,1.25.1;3.4', '[^.0-9]');
13 май 13, 13:09    [14287257]     Ответить | Цитировать Сообщить модератору
 Re: как определить символы-разделители  [new]
nerv
Member

Откуда:
Сообщений: 734
invm, пользователь выберет что-то одно.
просто потом в мастере импорта на строке
1.4,1.23.3/4.5
программа 1.4 соспоставит (по таблице справочнику кодов), а 1.23.3/4.5 попадет в ошибки и по результата импорта выдаст
'1.23.3/4.5 не найдено в справочнике'
И дело пользователя решать - либо вручную поправить, либо два кода в итоге не попадут в выборку.
13 май 13, 13:34    [14287382]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить