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

Откуда:
Сообщений: 11
Здравствуйте. Прошу помощи, т.к. с SQL не сильно знаком, но требуется решить на нем задачу.
Помогите, пожалуйста.

Есть файл на 1 млн строк, в каждой строке несколько слов, разделенных пробелами, кол-во слов в каждой строке варьируется от 1 до 10.

Пример:

служба вскрывания надежных замков в самаре
экстренное вскрывание замков омск
экстренное вскрывание замков в нижнем
вскрывание вен

Необходимо в SQL загрузить этот файл (это я уже сделал :)) и разобрать каждую строку по шаблону: есть 2 слова "вскрыван" и "замк", нужно сделать так, чтобы на выходе получилось 4 таблицы:

Таблица 1. Содержит в себе все слова, которые идут левее слова, которое содержит в себе "вскрыван";
Таблица 2. Содержит слова между словом, которое содержит в себе слово "вскрыван", и словом, содержащим "замк";
Таблица 3. Содержит слова справа от слова, содержащего в себе "замк";
Таблица 4. Все слова, которые не содержат в себе "вскрыван" и "замк".

Например, возьмем строку:
служба вскрывания надежных замков в самаре

Слово "служба" уходит в таблицу 1, слово "надежных" - в таблицу 2, слова "в" и "самаре" - в таблицу 3, в таблицу 4 попадают слова "служба", "надежных", "в" и "самаре".

Можно сделать такое?

Спасибо всем, кто откликнется.
4 фев 16, 14:05    [18772659]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
_human
Member

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

возможно вначале лучше распарсить как вам нужно на 4-е файла чем-то вроде C# или чем-то попроще, а потом импортить в таблицы.
4 фев 16, 14:16    [18772726]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
задача странная , а вы патом планируете соберать фразы обратно или нет ?
4 фев 16, 14:16    [18772727]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Mokronozhka,
А что, так зачет не ставят? Какой ваш вариант этого запроса? Выкладывайте сюда, мы подскажем, что неверно)
4 фев 16, 14:16    [18772730]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
_human
Member

Откуда:
Сообщений: 560
_human
чем-то попроще

regexp в Notepad++ :D
4 фев 16, 14:17    [18772740]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mokronozhka
Например, возьмем строку:
служба вскрывания надежных замков в самаре

Слово "служба" уходит в таблицу 1, слово "надежных" - в таблицу 2, слова "в" и "самаре" - в таблицу 3, в таблицу 4 попадают слова "служба", "надежных", "в" и "самаре".

Можно сделать такое?

Можно
Разбираете строку на слова.
И для каждого слова выполняете соответствующие действия
4 фев 16, 14:21    [18772764]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Смотрите, задачу решаю с помощью 1С, встроенным языком через запрос - валится, много условий, перебором по строкам - очень медленно, просто очень медленно.

Возникла идея сделать это через SQL, там быстрее должно все отрабатывать.

Есть файл, я его загружаю в SQL программно, затем разобрав его по шаблону на 4 таблицы эти таблицы должен получить обратно в 1С.

Чистый файлик, т.е. с 1 колонкой загружается в SQL за 10 секунд.

Я могу сделать файлик в 1С уже с разбивкой по словам, и загрузить его уже в таблицу с несколькими полями, но все-равно не знаю как решить задачу дальше.

Понимаете меня, или я плохо изъясняюсь? :)
4 фев 16, 14:25    [18772795]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Glory,
Я нашел как разбить строку по словам, но для 1 млн строк выполнения запроса не дождался, очень долго.

Запрос был такой, если ограничиться 7 словами, разделитель пробел:

SELECT Table_Query.query,
NewTable.Word1,
NewTable.Word2,
NewTable.Word3,
NewTable.Word4,
NewTable.Word5,
NewTable.Word6,
NewTable.Word7

FROM [dbo].[Table_Query]
cross apply ( select string = query + ' ' ) f1
cross apply ( select p1 = charindex( ' ', string ) ) ap1
cross apply ( select p2 = charindex( ' ', string, p1 + 1 ) ) ap2
cross apply ( select p3 = charindex( ' ', string, p2 + 1 ) ) ap3
cross apply ( select p4 = charindex( ' ', string, p3 + 1 ) ) ap4
cross apply ( select p5 = charindex( ' ', string, p4 + 1 ) ) ap5
cross apply ( select p6 = charindex( ' ', string, p5 + 1 ) ) ap6
cross apply ( select p7 = charindex( ' ', string, p6 + 1 ) ) ap7
cross apply ( select Word1 = substring( string, 1, p1-1 )
, Word2 = substring( string, p1+1, p2-p1-1 )
, Word3 = substring( string, p2+1, p3-p2-1 )
, Word4 = substring( string, p3+1, p4-p3-1 )
, Word5 = substring( string, p4+1, p5-p4-1 )
, Word6 = substring( string, p5+1, p6-p5-1 )
, Word7 = substring( string, p6+1, p7-p6-1 )
) NewTable

Но даже после этого я не знаю как разбить потом это все на 4 таблицы :)
4 фев 16, 14:27    [18772810]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mokronozhka
Понимаете меня, или я плохо изъясняюсь? :)

Понятно. Только зачем вы все это рассказываете ?
Вам нужно сесть и написать/нарисовать алгоритм ваших действий на строкой/строками
Где будут расписаны все ваши действия
И только потом начать спрашивать, а какая команда/функция/программа соответствует в TSQL вот этому моему действию в моем алгоритме
4 фев 16, 14:28    [18772819]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mokronozhka
Я нашел как разбить строку по словам, но для 1 млн строк выполнения запроса не дождался, очень долго.

Тогда ищите дальше
4 фев 16, 14:29    [18772825]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mokronozhka
Но даже после этого я не знаю как разбить потом это все на 4 таблицы :)

Если вы не знаете, что делать, то придумайте.
4 фев 16, 14:30    [18772831]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Mokronozhka, вообще такие задачи надо решать RexExp'ами, но мне было скучно, и я решил поизвращаться.

Вот что из этого получилось (спрятал под спойлер из-за большого размера строк - не люблю, когда страница разъезжается вправо).

+
declare @table table (word nvarchar(max));

insert into @table (word)
select word
from (values ('служба вскрывания надежных замков в самаре'),
			('экстренное вскрывание замков омск'),
			('экстренное вскрывание замков в нижнем'),
			('вскрывание замков'),
			('вскрывание вен')) as t (word)

select	substring(word, 1, patindex('%вскрыван%', word)-2) 
from	@table 
where	patindex('%вскрыван%', word) > 2

select	substring(word
			, patindex('%вскрыван%', word) + 
			  patindex('% %', substring(word, patindex('%вскрыван%', word), len(word)))
			, patindex('%замк%', substring(word, patindex('%вскрыван%', word) + patindex('% %', substring(word, patindex('%вскрыван%', word), len(word))), len(word)))-2)
from	@table
where	patindex('%вскрыван%', word) > 2 
	and patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word))) > patindex('% %', substring(word, patindex('%вскрыван%', word), len(word))) + 1


select	substring(word
			, patindex('%вскрыван%', word) + 
			  patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word))) +
			  patindex('% %', substring(word, patindex('%вскрыван%', word) + patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word)))-1, len(word)))-1
			, len(word))
from	@table
where	patindex('%вскрыван%', word) > 2 
	and patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word))) > 0
	and patindex('% %', substring(word, patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word))), len(word))) > 0

select	word
from	@table
where	patindex('%вскрыван%', word) = 0 
	or	patindex('%замк%', substring(word, patindex('%вскрыван%', word), len(word))) = 0
4 фев 16, 15:14    [18773061]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Minamoto,
Большое-большое спасибо, работает оочень быстро, осталось только строки, раскинутые по таблицам разбить по столбцам.
Т.е. сейчас, если в левую таблицу попадает строка "слушать песню", надо ее разбить на 2 колонки "слушать" и "песню".
4 фев 16, 16:53    [18773662]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Mokronozhka
Minamoto,
Большое-большое спасибо, работает оочень быстро, осталось только строки, раскинутые по таблицам разбить по столбцам.
Т.е. сейчас, если в левую таблицу попадает строка "слушать песню", надо ее разбить на 2 колонки "слушать" и "песню".

Ну это вы уж сами реализуйте, в коде, который я сделал, есть все необходимые для этого функции, вам осталось только правильно их применить )
4 фев 16, 18:23    [18774183]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать строки таблицы на 4 таблицы по шаблну  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Minamoto,
Да, я это вижу, конечно сделаю сам!
Спасибо Вам большое еще раз :)
5 фев 16, 07:38    [18775577]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить