Имя: Пароль:
1C
 
Ускорить нормализацию строки
0 Злопчинский
 
23.09.10
16:30
Допустим, есть справочник.
для обработки требуется нормализовать (т.е. удалить лишние символы) наименования...
.
делается так типа через функцию
.
//*****************************************************************
//заменяет в строке Источник символы из набора НормальныйШаблон
//на символ Нормализатор;
//если в наборе НормальныйШаблон присутствует символ Нормализатора,
//то нормализация происходит на пустой символ
//
Функция глНормализоватьСтроку(Знач Источник, Знач НормальныйШаблон="\/:*?""<>| ", Знач Нормализатор="#")
Экспорт
   
   Если  Найти(НормальныйШаблон,Нормализатор) = 0
   Тогда //ок, символ-заменитель не входит в список запрещенных символов
   Иначе Нормализатор = "";
   КонецЕсли;
   
   Источник = СокрЛП(Источник);
   Дл = СтрДлина(НормальныйШаблон);
   Для  ы=1 по Дл
   Цикл Источник = СтрЗаменить(Источник,Сред(НормальныйШаблон,ы,1),Нормализатор);
   КонецЦикла;
   
   Возврат Источник;
КонецФункции //глНормализоватьСтроку()    
.
собственно вопрос: а как ускорить нормализацию?
1. regexp - ????
2. если наименования получаем прямым запросом - как можно прямо на скуле обработать по приведенному алгоритму?
.
спсб!
1 МихаилМ
 
23.09.10
16:49
regexp + поле с нормализованными даными.

учитывая, что компилятр tsql - создаёт код работающий быстрее, чем нет сборки
в каких-то ситуациях можно и метод tsql - написать.
2 Cthulhu
 
23.09.10
16:51
распиши пооператорно и сделай замер производительности.
3 Злопчинский
 
23.09.10
16:56
(1) и как на скуе это выглядит? ибо чайник полный тут...
4 Злопчинский
 
23.09.10
17:01
можно конечно вместо СтрЗаменить тупо сделать посимвольное сложение, символ брать из матрицы по коду исходного символа... будет ли это быстрее - хз...
5 МихаилМ
 
23.09.10
17:05
(3)
читайте доки . функций работы со стоками очень мало.

в вашем коде я бы заменил сред на элемент массива
6 Злопчинский
 
23.09.10
17:09
(5) по типу как я в (4) написал...?
7 Злопчинский
 
23.09.10
17:10
(5) доку я почитаю, написать "функцию" - это возможно сумею. я слаб в смысле куда ее правильно привязывать в запросе... т.е. тотально слаб в самом скуле..
8 МихаилМ
 
23.09.10
17:14
нет .

только вместо
Сред(НормальныйШаблон,ы,1) -
массив[ы]

ну и конечно же я бы обявил все переменные.
но это уже совсем другая тема.
9 Mikeware
 
23.09.10
17:15
(7) она не "в запросе". Она "в скуле"...
10 NikVars
 
23.09.10
17:41
(0) А если проверку добавить?
   Для  ы=1 по Дл Цикл
       Если Найти(Источник,Сред(НормальныйШаблон,ы,1))>0
         Источник = СтрЗаменить(Источник,Сред(НормальныйШаблон,ы,1),Нормализатор);
        КонецЕсли
   КонецЦикла;
11 Злопчинский
 
23.09.10
17:48
(8) про объявление переменных, вынос кода из функции a локальный контекст и прочее - это понятно...
.
про этот массив - понятно, но как правило нормализуемые строки намного больше шаблона-нормализатора, так что тут выигрыш конечно будет, но не особый...
12 Злопчинский
 
23.09.10
17:49
(10) это стопудово неверно.. СтрЗаменить по любому так или иначе вхождение ищет...
13 NikVars
 
23.09.10
22:02
(12) Это понятно, но 1С такая непредсказуемая.
Сам не ожидал, какая это непредсказуемая дама, эта 1С.
Или так:
Для  ы=1 по Дл Цикл
 СимволШаблона=Сред(НормальныйШаблон,ы,1);
 Нашли=Найти(Источник,СимволШаблона);
 Если Нашли>0 Тогда
   Источник = СтрЗаменить(Прав(Источник,СтрДлина(Источник)-Нашли+1),СимволШаблона,Нормализатор);
 КонецЕсли
КонецЦикла;
В общем, пробуй!
Программист всегда исправляет последнюю ошибку.