Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз / 25 сообщений из 53, страница 1 из 3
04.08.2004, 15:07
    #32635221
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Hell'0 W0RLD! :)
Есть таблица с кучей строк - наименования препаратов от разных поставщиков , Сводный прайс поставщиков(СПП). 35000 строк
И есть таблицы - номенклатурный справочник предприятия(НСП). 5 000 строк
Необходимо для каждой позиции из НСП найти все аналоги из СПП, если они есть.
Проблема заключается в том, что каждый поставщик использует свой стиль написания наименований.
Вот пример из СПП, где один препара имеет несколько написаний:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
5-НОК 0,05 N50 ДРАЖЕ
5-НОК 50МГ N50 ТАБЛ П/ОБ
5-НОК 50МГ ТАБ. Х50
5-НОК №50,ТАБ
5-Нок др. 50мг N50
5-НОК ТАБ. П/О 50МГ №50
5-НОК ТАБ. П/О 50МГ №50
5-НОК ТАБ.П/О 0.05Г N50
5-НОК ТАБЛ. П/О 50МГ N50  РОССИЯ-СЛОВЕНИЯ
5-НОК ТАБЛ. П/О 50МГ N50 СЛОВЕНИЯ
Попытка вытянуть все явные одинаковости неудачна - из 35 000 СПП лишь 300 четко соответсвуют наименованиям из НСП.
Т.о. приходится решать задачу унификации написания наименований.
Если сокращения я еще могу исправить - напишу запрос для каждого поставщика, где буду исправлять "таб", "табл", "тб." на "таблетка"(или ампула, флакон, крем, гель и т.п.), то с цифрами ГОРАЗДО сложнее - как видно из примера, даже Номер все пишут по-разному (Х50, N50, №50), не говоря уже о разделителе дробной части (, или . ) и дозировке ( 50 МГ, 0,05 Г)
И еще есть проблема порядкового следования - у одного идет 0,05 и потом ТАБ, а у другого наоборот.
---
Сначала мне казалось, что replace, patindex, charindex меня спасут...
Но когда я накорябал 200 строк одних реплейсов и кол-во уникальных записей упало с 35 до 32 тыс, я понял - неправильным путем иду.
Может кто-то решал подобную задачу, мож у кого есть свежие идеи или ссылки на свежие идеи...
Хелп...
...
Рейтинг: 0 / 0
04.08.2004, 15:57
    #32635321
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Только вручную.
Или потребуйте от поставщиков критерий - пусть шлют артикул какой-нибуть.
...
Рейтинг: 0 / 0
04.08.2004, 16:32
    #32635403
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
первое уточнение - поставщики плевать хотели на мои требования - "мы не станем менять справочники из-за такой мелочи".
второе уточнение- сейчас я решаю задачу именно ручным методом. Но если мне удасться автоматически уменьшить кол-во неидентичных записей до меньшего, чем в НСП, то это уже успех, т.к. можно уже выставлять соответсвия в обратную сторону, а это много быстрее...
...
Рейтинг: 0 / 0
04.08.2004, 16:38
    #32635422
Chuveljov Andrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
У каждого поставщика свой справочник?
Так составьте таблицу соответствия.

А вообще на лекарства (я правильно понял, это лекартсва) существует вполне едиообраный способ написания - так как они внесены в реестр Минздрава. Всё остальное - от лукавого.

___________________
Всё вышеизложенное есть моё частное мнение и не претендует на полноту изложения.
...
Рейтинг: 0 / 0
04.08.2004, 16:53
    #32635466
r2d2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Можно попробовать функцию нечеткого сравнения, в инете где-то болтается.
на входе две строки на выходе степень схождения
если ну очень надо, а искать лень - могу скинуть
...
Рейтинг: 0 / 0
04.08.2004, 16:54
    #32635467
Николай МВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Ваша проблема очень хорошо рассмотрена в топике "Убей двойника". Там речь немного о другом, но смысл тот же.
Если вкратце -- человеческие ошибки придется исправлять человекам, вы можете лишь ускорить этот процесс с помощью крутых алгоритмов подбора вероятных двойников.
...
Рейтинг: 0 / 0
04.08.2004, 17:02
    #32635497
Николай МВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Еще можете попробовать функцию DIFFERENCE, она только для латинских букв, но не в этом проблема. Она очень грубая, толку никакого...
Если решитесь попробовать, могу Вам кинуть свою функцию замены русских букв на латинские.
...
Рейтинг: 0 / 0
04.08.2004, 17:26
    #32635574
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Отвечу всем по порядку.
1. Chuveljov AndrewУ каждого поставщика свой справочник?
Так составьте таблицу соответствия.

А вообще на лекарства (я правильно понял, это лекартсва) существует вполне едиообраный способ написания - так как они внесены в реестр Минздрава. Всё остальное - от лукавого.
Представляете себе 35 000 раз выставлять соответсвия? Я почти так и делаю, но это же гемор невообразимый!
А насчет реестра Минздрава - да, я тоже эту мантру знаю и повторяю ее. Но реальность такова, какой ее чувствует орган, а не какой изображает фотография :))
2. r2d2Можно попробовать функцию нечеткого сравнения, в инете где-то болтается.
на входе две строки на выходе степень схождения
если ну очень надо, а искать лень - могу скинуть
Это дело я долго изучал - не годится. Дело в том, что для этой функции разница в номере (№10, №20) равнозначна разнице в написании номера (№10, Х10) Что не есть гут.
Николай МВВаша проблема очень хорошо рассмотрена в топике "Убей двойника". Там речь немного о другом, но смысл тот же.
...
Еще можете попробовать функцию DIFFERENCE, она только для латинских букв, но не в этом проблема. Она очень грубая, толку никакого...

Надо посмотреть. Только это не ошибки.
А Difference здесь никак.
---
Мне ведь что надо? Разобрать строку, выделить из нее лексемы и занести их в другие поля. А потом собрать строку из этих полей.
В итоге я просто Напишу
Select Имя+ФормаВыпуска+Дозировка+Номер+Остальное From MySuperTable
Вот дожить бы до "В итоге"...
...
Рейтинг: 0 / 0
04.08.2004, 17:37
    #32635597
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Grigoriyпервое уточнение - поставщики плевать хотели на мои требования - "мы не станем менять справочники из-за такой мелочи".
Им не нужно менять справочники, у них уже есть свои идентификаторы товаров, и нужно всего-лишь попросить их прислать. Обычно это так. Разве-что поставщики ваши - челноки, везущие аспирин по таблетке. :-)
...
Рейтинг: 0 / 0
04.08.2004, 17:40
    #32635602
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Ай мин, что ДАЖЕ если они будут присылать свой артикульный номер - какая мне разница?
Ну придется сопоставлять артикульные номера, которые у каждого свои. Жэто еще хуже. ЕДИНЫЙ НОМЕР не используется. Такова правда жизни. Таковы программы отсылки прайсов на той стороне.
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
04.08.2004, 18:14
    #32635687
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
GrigoriyАй мин, что ДАЖЕ если они будут присылать свой артикульный номер - какая мне разница?
Ну придется сопоставлять артикульные номера, которые у каждого свои. Жэто еще хуже. ЕДИНЫЙ НОМЕР не используется. Такова правда жизни. Таковы программы отсылки прайсов на той стороне.
wBr Grigoriy Gruben
Разумеется, ЕДИНЫЙ НОМЕР не используется.
Нужно сделать таблицу соответствий НСП артикульным номерам по поставщикам. Для каждого товара - список записей артикул+код_поставщика. Далее при импорте (обновлении прайсов) они будут обновляться по этим номерам. Новые товары, для которых сопоставления нет, будете заносить вручную. Первичная привязка - тоже вручную. Других вариантов всё-равно нет.
...
Рейтинг: 0 / 0
05.08.2004, 09:21
    #32636181
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
"Первичная привязка - вручную."
В этом то и проблема...
Т.е. механизмов, позволяющих? к примеру, вырезать из строки цифры между % и стоящей ранее ^ нет?
Только средствами дельфей смогу?
...
Рейтинг: 0 / 0
05.08.2004, 09:58
    #32636251
sti
sti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Вот уже обсуждали подобное:

http://www.sql.ru/forum/actualthread.aspx?tid=89526&hl=%e0%f1%ef%e8%f0%e8%ed
...
Рейтинг: 0 / 0
05.08.2004, 11:19
    #32636432
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Grigoriy"Первичная привязка - вручную."
В этом то и проблема...
Т.е. механизмов, позволяющих? к примеру, вырезать из строки цифры между % и стоящей ранее ^ нет?
Только средствами дельфей смогу?
Почему, кое-какие есть, хотя на дельфях проще. А ещё проще с регулярными выражениями, если вы с ними работали.
Можно сделать предварительную обработку, 80-90 % обработается правильно. Но всё-равно нужно будет вручную всё проверить.
В MSSQL для работы со строками см. PATINDEX и SUBSTRING.

Кстати, для этой обработки можно создать правила лдя каждого поставщика отдельно, если их немного и если каждый поставщик использует строго определённое написание, скажем, если у одного всегда 50МГ, а у другого всегда 0.05Г.
...
Рейтинг: 0 / 0
05.08.2004, 12:23
    #32636585
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
насчет patindex и т.д. - см первый постинг темы :)
Насчет раздельного форматирования- именно так я и поступлю
10 постащиков - не проблема
...
Рейтинг: 0 / 0
05.08.2004, 13:44
    #32636804
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
по поводу регулярных выражений...
есть в серваке механизмы, позволяющие мне
вместо
реплейса
Х1
Х2
Х3
использовать более короткую форму типа replace(ИМЯ, 'Х[0-9]','№[0-9]')
?
...
Рейтинг: 0 / 0
05.08.2004, 14:11
    #32636878
Алексей2003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create function dbo.substr(@s varchar( 100 ), @p1 int, @p2 int)
returns varchar( 100 )
as begin
 return substring(@s, @p1, @p2-@p1)
end
go
declare @s varchar ( 100 )
set @s = 'fdsag X3 fdrewq'
select dbo.substr(@s, patindex('%X[0-9]%', @s), charindex(' ', @s, patindex('%X[0-9]%', @s)))
go
drop function dbo.substr
примерно так

для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
05.08.2004, 15:19
    #32637119
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
patindex не работает в этой функции
...
Рейтинг: 0 / 0
05.08.2004, 15:23
    #32637133
Алексей2003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
у меня "Х" англицкая


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
05.08.2004, 15:23
    #32637136
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
...Что неудивительно при Ха напечатанном буквой Икс :)
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
05.08.2004, 15:49
    #32637227
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create function dbo.findNum(@s varchar( 255 ))
returns varchar( 100 )
as begin
declare @p1 int
declare @p2 int
declare @retu varchar( 255 )
 set @s=@s+' '
 set @p1=patindex('% Х[0-9]%',@s)
 if @p1> 0  
  begin
    set @p2=charindex(' ', @s, @p1+ 2 )
    set @retu= substring(@s, @p1+ 2 , @p2-@p1- 2 ) --+'|'+Str(@p1)+'|'+Str(@p2)+'|'+@s 
  end else 
  begin
    set @retu='NULL'
  end
  if ISNUMERIC(@retu)= 1   set @retu=@retu else  set @retu='NULL'
  return @retu
end
go
declare @s varchar ( 255 )
select dbo.FindNum(NAimEN) From  NewPrice 
Where dbo.FindNum(NAimEN)<>'NULL'
drop function dbo.FindNum

Вот что я сделал из вашей функции - с учетом номера в конце строки и другими неожиданностями :)
Нормально?
Неудобно то, что в Where я тоже юзаю эту функцию - это неверно наверное?
...
Рейтинг: 0 / 0
05.08.2004, 15:59
    #32637261
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
И еще вопрос
можно ли переделать функцию так, чтобы вторым парметром шел не просто символ (Х или N), а набор символов, который может означать номер?
Например, [Х, N, №]

wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
05.08.2004, 16:02
    #32637273
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
patindex не работает в этой функции
Не все что угодно можно использовать в качестве параметров для функций и процедур

Например, [Х, N, №]
Собственно и [ХN№]
...
Рейтинг: 0 / 0
05.08.2004, 16:14
    #32637310
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
с Patindex разобрались, всё ОК
А вот с [NХ№] не совсем...
set @Symb='[NХ№]'
set @p1=patindex('% '+@Symb+'[0-9]%',@s)
дает 0 всегда.
т.е.
[NХ№][0-9]
недопустимая конструкция?
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
05.08.2004, 16:16
    #32637319
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение таблицы строк к единому виду, помогите плиз
Сорри за режим чата, но правильно всё же
[N,Х,№]
wBr Grigoriy Gruben
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Приведение таблицы строк к единому виду, помогите плиз / 25 сообщений из 53, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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