Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Быстрый способ обработки Таблиц значений, Массивов

Быстрый способ обработки Таблиц значений, Массивов
Я
   13_Mult
 
28.03.14 - 11:21
Добрый день!
Есть с первого взгляда не тривиальная задача. Полученный запросом из сторонней базы массив (либо таблица значений)содержит очень много колонок и строк со значением с типом строка. В этих строках есть куча "рандомных" пробелов до и после текста.
Вопрос: Какой способ наиболее быстрый для удаления всех пробелов в Массиве и ТаблицеЗначений.
СокрЛП в цикле не рассматривается.
Может есть какие сторонние компоненты для быстрой обработки сразу всего Массива/ТЗ.
Далее полученный результат будет использоваться в запросе.
 
 
   H A D G E H O G s
 
1 - 28.03.14 - 11:21
СокрЛП в цикле
   Heckfy
 
2 - 28.03.14 - 11:22
А что мешает сразу при получении данных из сторонней базы обрезать пробелы?
   Ненавижу 1С
 
3 - 28.03.14 - 11:23
"Полученный запросом из сторонней базы"

в некоторых сторонних базах есть функция TRIM
   13_Mult
 
4 - 28.03.14 - 11:23
(1) Долго
   13_Mult
 
5 - 28.03.14 - 11:24
(2) Каким образом
(3) У 1С к сожалению нет такой
   13_Mult
 
6 - 28.03.14 - 11:25
(3) Прямое подключение не дают сделать
   13_Mult
 
7 - 28.03.14 - 11:27
В javascript есть replace(/\s/g, '') но это работает со строками (
   Ненавижу 1С
 
8 - 28.03.14 - 11:28
(6) "Полученный запросом из сторонней базы массив"
ну как-то же его получили
   13_Mult
 
9 - 28.03.14 - 11:29
В VBScript RegExp.Replace тоже не примет массив
   13_Mult
 
10 - 28.03.14 - 11:29
(8) Через COM
   Ненавижу 1С
 
11 - 28.03.14 - 11:30
(10) через COM из другой базы 1С что ли?
   13_Mult
 
12 - 28.03.14 - 11:30
(8) я имел в виду к SQL не дают
   13_Mult
 
13 - 28.03.14 - 11:31
(11) Так точно
   fvadim
 
14 - 28.03.14 - 11:32
(9) а если скормить многострочный текст, т.е. каждую колонку лепить в одну строку и скармливать регэкспу?
   vvp91
 
15 - 28.03.14 - 11:34
>> (0) Вопрос: Какой способ наиболее быстрый для удаления всех пробелов в Массиве и ТаблицеЗначений.
Самый быстрый - не удалять вообще.

>> (0) Далее полученный результат будет использоваться в запросе.
А как "результат" или оригинальная ТЗ будет использоваться в запросе?
   13_Mult
 
16 - 28.03.14 - 11:34
(14) тогда уж и СокрЛП в цикле по времени не больше займет
   fvadim
 
17 - 28.03.14 - 11:35
(16) а сколько сокрлп занимает времени?
   13_Mult
 
18 - 28.03.14 - 11:36
(15) Либо Менеджером либо параметром Список
   H A D G E H O G s
 
19 - 28.03.14 - 11:36
(16) СокрЛП () для строк COM таблицы?
   13_Mult
 
20 - 28.03.14 - 11:37
(17) 4,5 минут
   H A D G E H O G s
 
21 - 28.03.14 - 11:38
(16) Вызывай функцию ОМ сторонней базы, которая вернет уже обрезанную таблицу
   H A D G E H O G s
 
22 - 28.03.14 - 11:38
(20) Бред.
   13_Mult
 
23 - 28.03.14 - 11:38
(19) )) нет конечно
   13_Mult
 
24 - 28.03.14 - 11:38
(22) нет не бред!
   13_Mult
 
25 - 28.03.14 - 11:39
(22) Иначе не запрашивал мнения общественности
   13_Mult
 
26 - 28.03.14 - 11:41
(21) Тогда она там обрезать их долго будет
   H A D G E H O G s
 
27 - 28.03.14 - 11:45
(26) Покажи код, как режешь
   13_Mult
 
28 - 28.03.14 - 11:46
Я спрашиваю не про штатные 1с методы. А про обработку массивов другими, не 1совскими методами. (внешние компоненты например)
   13_Mult
 
29 - 28.03.14 - 11:48
(27) Пока ни ка не режу. ТЗ перебирать, обрезать и обратно совать в ТЗ не вариант - долго.
   H A D G E H O G s
 
30 - 28.03.14 - 11:48
(28) Помоему, ты штатные методы криво используешь.
 
 
   13_Mult
 
31 - 28.03.14 - 11:50
Пробовал даже так

RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Pattern = " ";
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Истина;
    Для Каждого Стр Из Результат Цикл 
        ИсходнаяСтрока = Стр.КодГ;
        RegExp.Replace(ИсходнаяСтрока, "");
        НовСтр = ТЗ.Добавить();
        НовСтр.КодНорм = RegExp.Replace(ИсходнаяСтрока, "");
    КонецЦикла;

также долго как и СокрЛП().
   fvadim
 
32 - 28.03.14 - 11:53
(31) оно ж все пробелы убирает, не?
   13_Mult
 
33 - 28.03.14 - 11:54
(32) да, именно это и надо.
   13_Mult
 
34 - 28.03.14 - 11:54
Текст "Литой" без разделителей
   Heckfy
 
35 - 28.03.14 - 11:55
(33) Вы уж определитесь, все или только с концов?
   13_Mult
 
36 - 28.03.14 - 11:57
(35) В (0) написано "для удаления всех пробелов в Массиве и ТаблицеЗначений"
))
   fvadim
 
37 - 28.03.14 - 11:58
(36) к чему тогда был упомянут СокрЛП ?
   13_Mult
 
38 - 28.03.14 - 12:00
Как то я пользовался компонентой GameWithFire.ADOUtils
она очень быстро в ТЗ засовывает из огромных таблиц excel.

Вот бы что то вроде неё для работы с массивами
   Heckfy
 
39 - 28.03.14 - 12:01
А сколько значений в ТЗ или Массиве возвращается?
   13_Mult
 
40 - 28.03.14 - 12:03
(37) а у 1С есть ещё методы сократить пробелы у строки? (СтрЗаменить не в счет)
   13_Mult
 
41 - 28.03.14 - 12:04
ушел на обед
   Heckfy
 
42 - 28.03.14 - 12:06
(41)  Пля... Ты взорвал мне моск... Приятного аппетита. И, лучше не возвращайся. :)
   13_Mult
 
43 - 28.03.14 - 12:19
(42) есть у меня одна мысль. На стороне базы источника запилить СКД механизм получения таб документа и через построитель запроса получить ТЗ. Вроде как пробелы там должны обрезаться. Изврат конечно но попробовать надо.
   H A D G E H O G s
 
44 - 28.03.14 - 12:26
(43) Что мешает там тупо получить ТЗ и обрезать ее?
   kiruha
 
45 - 28.03.14 - 12:30
(0)
В 8.3 писали что существенно улучшена работа со строками
Также вроде как появились регуляры
   13_Mult
 
46 - 28.03.14 - 12:30
(44) Если бы был метод обрезать целиком ТЗ то не было бы вопросов, а резать по одной строке долго.
   ChiginAV
 
47 - 28.03.14 - 12:31
(0) А нельзя в сторонней базе хранить данные без этих самых "рандомных" пробелов до и после текста?
   13_Mult
 
48 - 28.03.14 - 12:31
(45) надо глянуть (8.3 особо не пользовал)
   trad
 
49 - 28.03.14 - 12:35
(0)
проверь такую идею

&НаСервере
Функция СокрЛП_ТЗ(ТЗ)
    Строка = ЗначениеВСтрокуВнутр(ТЗ);
    Пока Найти(Строка,"{""S"","" ")>0 Цикл
        Строка = СтрЗаменить(Строка,"{""S"","" ","{""S"",""");
    КонецЦикла;
    Пока Найти(Строка," ""}")>0 Цикл
        Строка = СтрЗаменить(Строка," ""}","""}");
    КонецЦикла;
    ТЗ=ЗначениеИзСтрокиВнутр(Строка);
    Возврат ТЗ;
КонецФункции
   13_Mult
 
50 - 28.03.14 - 12:36
(47) У меня вообще сомнения что в ней дадут что то сделать. Так бы я в той базе убил бы все пробелы, запретил бы их ставить и нет проблем )). Поэтому и бьёмся.
   ChiginAV
 
51 - 28.03.14 - 12:43
(50) Ну тогда прямой SQL запрос с REPLACE
   13_Mult
 
52 - 28.03.14 - 12:54
(49) Спасибо, Функция конечно зачетная (ни когда так не пробовал ;)). К сожалению тоже долго, циклы.

(51) Ах, если бы дали доступ )). Там свои враждебно настроенные сидят ))

Наверно будем пробивать доступ к серверу сиквела.
Пока отдам как есть. Будут говорить долго - скажу давайте доступ к серверу.

Всем спасибо за предложения!
   fvadim
 
53 - 28.03.14 - 12:55
м = Новый Массив;
Для Индекс = 1 По 1000000  Цикл
    м.Добавить("  ааа  ");
КонецЦикла; 

s = ЗначениеВСтрокуВнутр(м);
Для каждого э Из м Цикл
    э = СокрЛП(э);
КонецЦикла; 

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;

RegExp.Pattern = " +"; 
s=RegExp.Replace(s, "");

м2 = ЗначениеИзСтрокиВнутр(s);


3    м = Новый Массив;    0
4    Для Индекс = 1 По 1000000  Цикл    5,79
5    м.Добавить("  ааа  ");    7,56
6    КонецЦикла;    6,15
8    s = ЗначениеВСтрокуВнутр(м);    1,45
9    Для каждого э Из м Цикл    7,25
10    э = СокрЛП(э);    6,43
11    КонецЦикла;    5,09
13    RegExp = Новый COMОбъект("VBScript.RegExp");    0
15    RegExp.MultiLine = Истина;    0
16    RegExp.Global = Истина;    0
17    RegExp.IgnoreCase = Истина;    0
19    RegExp.Pattern = " +";    0
20    s=RegExp.Replace(s, "");    0,93
22    м2 = ЗначениеИзСтрокиВнутр(s);    1,78
23    КонецПроцедуры    0

   fvadim
 
54 - 28.03.14 - 12:58
Расшифрую
СокрЛП 1000000 элементов
7,25 6,43 5,09 - 18.77%

Замена по всему массиву регулярным выражением
1,45 0,93 1,78 - 4.16 %
   13_Mult
 
55 - 28.03.14 - 13:07
(53) (54) Точно, как я сам не догадался после чтения (49)
Спс. Наверно так и сделаю.
Еще раз всем СПС, тему можно закрывать.
   13_Mult
 
56 - 28.03.14 - 13:08
Ушел тестить.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.