В моей практике програмиста понадобился способ получения массива чисел из строки.
Пришлось писать функцию.
Условия задачи:
- Разложение строки в массив чисел выполнять НА КЛИЕНТЕ дял уменьшения нагрузки на сервер.
- Алгоритм должен быть МАКСИМАЛЬНО БЫСТРЫМ.
Для этих целей я написал простую обработку, реализующую 2 способа обработки неограниченной строки в число. Точнее, в массив чисел:
- Один способ использует обычный перебор символом и выделение символов цифр из строки.
- Второй способ использует регулярные выражения.
В обработке есть 4 команды, позволяющие протестировать 2 способа разложения НА СЕРВЕРЕ, НА КЛИЕНТЕ.
Таким образом, можно оценить разницу скоростей выполнения.
Заранее невозможно предсказать скорость выполнения данной задачи. ПОЧЕМУ:
1. При выполнении на сервере время выполнения зависит от:
- Скорости работы памяти на сервере
- Скорости работы локальной сети (при больших объемах данных). Например, попробуйте загнать в обработку 1000 строк и посмотрите на скорость выполнения!
- От нагрузки на сеть и сервер в текущий момент времени.
2. При выполнении обработки на клиенте время выполнения зависит от:
- скорости работы локальной памяти на компьютере
- мощности процессора на локальном компе и т.п.
Поэтому по сути В ОБЩЕМ случае невозвожно предложить тот или иной способ из 4-х предложенных в данной обработке!
Тестируйте на каждом отдельном компьютере и сервере, на больших данных!
Удачи!
P.S. Напоследок немного кода:
1. Замер времени выполнения кода в миллисекундах, секундах, ну можно еще минутах, часах и т.п.
Сообщить("Начало замера времени: получение массива чисел из строки. Регулярные выражения. На Сервере", СтатусСообщения.Важное);
НачалоТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
... исполняемый код
ОкончаниеТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВремяВыполненияВМиллисекундах = ОкончаниеТочноеВремяМиллисекунды - НачалоТочноеВремяМиллисекунды;
ВремяРаботыСекунд = цел(ВремяВыполненияВМиллисекундах/1000);
ФорматВремени = "ДЛФ=В";
ВремяВыполнения = "Окончание замера времени. Время работы (секунд:миллисекунд): "+ФОРМАТ(ВремяРаботыСекунд,"ДЛФ=T")
2. Неограниченная Строка в массив чисел, способ №1
Функция НайтиЧислаВСтрокеОбычныйСпособНаСервере(Строка)
// для примера возьмем такую строку Строка = "ыдлвапдлцоук234124ывпо555епрст1я"
Сообщить("Начало замера времени: получение массива чисел из строки. Обычный способ. На Сервере", СтатусСообщения.Важное);
НачалоТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1
СтрокаЧисел = "";
Для Индекс = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки
Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
СтрокаЧисел = СтрокаЧисел + Символ;
ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
СтрокаЧисел = "";
КонецЕсли;
КонецЦикла;
Если СтрДлина(СтрокаЧисел)>0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
КонецЕсли;
ОкончаниеТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВремяВыполненияВМиллисекундах = ОкончаниеТочноеВремяМиллисекунды - НачалоТочноеВремяМиллисекунды;
ВремяРаботыСекунд = цел(ВремяВыполненияВМиллисекундах/1000);
ФорматВремени = "ДЛФ=В";
ВремяВыполнения = "Окончание замера времени. Время работы (секунд:миллисекунд): "+ФОРМАТ(ВремяРаботыСекунд,"ДЛФ=T")+":"+Формат(ВремяВыполненияВМиллисекундах - ВремяРаботыСекунд*1000, "ЧЦ=3; ЧН=000; ЧВН=");
Сообщить(ВремяВыполнения, СтатусСообщения.Важное);
Возврат МассивЧисел; // Из строки в начале функции, получается массив: 234224, 555 и 1
КонецФункции
3. Неограниченная Строка в массив чисел. Способ №2. Регулярные выражения.
Функция НайтиЧислаВСтрокеРегулярныеВыраженияНаСервере(Строка)
// для примера возьмем такую строку Строка = "ыдлвапдлцоук234124ывпо555епрст1я"
Сообщить("Начало замера времени: получение массива чисел из строки. Регулярные выражения. На Сервере", СтатусСообщения.Важное);
НачалоТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
RegExp.Pattern = "\d+";
Matches= RegExp.Execute(Строка);
Для Сч = 0 по Matches.Count()-1 Цикл
Match = Matches.Item(Сч);
//Сообщить("" + Match.Value+ "");
МассивЧисел.Добавить(Число(Match.Value));
Submatches = Match.Submatches;
Для сч1=0 по Submatches.Count()-1 Цикл
Submatch = Submatches.Item(Сч1);
МассивЧисел.Добавить(Число(Submatch));
КонецЦикла;
КонецЦикла;
ОкончаниеТочноеВремяМиллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВремяВыполненияВМиллисекундах = ОкончаниеТочноеВремяМиллисекунды - НачалоТочноеВремяМиллисекунды;
ВремяРаботыСекунд = цел(ВремяВыполненияВМиллисекундах/1000);
ФорматВремени = "ДЛФ=В";
ВремяВыполнения = "Окончание замера времени. Время работы (секунд:миллисекунд): "+ФОРМАТ(ВремяРаботыСекунд,"ДЛФ=T")+":"+Формат(ВремяВыполненияВМиллисекундах - ВремяРаботыСекунд*1000, "ЧЦ=3; ЧН=000; ЧВН=");
Сообщить(ВремяВыполнения, СтатусСообщения.Важное);
Возврат МассивЧисел; // Из строки в начале функции, получается массив: 234224, 555 и 1
КонецФункции