|
|
|
Ускорить нормализацию строки | ☑ | ||
|---|---|---|---|---|
|
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),СимволШаблона,Нормализатор); КонецЕсли КонецЦикла; В общем, пробуй! |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |