Строка в число (Обычный способ и способ, основанный на регулярных выражениях). Тестирование скорости выполнения на больших данных

21.01.16

Разработка - Универсальные функции

В данной обработке используется 2 способа выделения массива чисел из заданной строки любого размера.
Один способ использует обычный перебор символом и выделение символов цифр из строки.
Второй способ использует регулярные выражения.
На разном оборудовании разные способы выдают разное время выполнения.
Для внедрения в конфигурацию одного из способов может потребоваться протестировать время выполнения (миллисекунд) и сравнить.
Именно для этих целей предназначена данная простая обработка.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Строка в число
.epf 9,00Kb
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • Поиск от одного разработчика до ИТ-команд под проект.
  • Обмен любыми контактами разрешён.
  • 0% комиссии, допускаются расчёты напрямую.

В моей практике програмиста понадобился способ получения массива чисел из строки.

Пришлось писать функцию.

Условия задачи:

  1. Разложение строки в массив чисел выполнять НА КЛИЕНТЕ дял уменьшения нагрузки на сервер.
  2. Алгоритм должен быть МАКСИМАЛЬНО БЫСТРЫМ.

Для этих целей я написал простую обработку, реализующую 2 способа обработки неограниченной строки в число. Точнее, в массив чисел:

  1. Один способ использует обычный перебор символом и выделение символов цифр из строки.
  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
КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

Строка в число Число из строки массив чисел из строки Число Строка Строка Число

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4673    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8675    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    56777    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7997    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    71319    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9994    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pvlunegov 160 21.01.16 16:10 Сейчас в теме
Прошу прощения за опечатки в тексте. Позже исправлю
2. K_A_O 554 25.01.16 10:06 Сейчас в теме
Вроде бы сейчас стандартный способ через ОписаниеТипов:

ОписаниеТипаЧисло = новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Длина, Точность, ДопустимыйЗнак[Знак]));
возврат ОписаниеТипаЧисло.ПривестиЗначение( Строка ) ;

3. pvlunegov 160 25.01.16 14:32 Сейчас в теме
(2) K_A_O, это вопрос или утверждение? или совет?
поясняйте как то, непонятно что вы имеете ввиду
4. K_A_O 554 25.01.16 15:02 Сейчас в теме
(3) Даже не знаю, что это. Просто выбрано для тестирования 2 способа. А типовой на скорость не проверен. Почему он обделен, не должен быть медленным.

5. pvlunegov 160 25.01.16 16:14 Сейчас в теме
(4) K_A_O,
Вы пробовали ваш метод на строках вида
"укпорто348567ыквпрв
3847ошпи34895ои"?

Знаете возвращает метод приведения типов от такой строки?
Попробуйте.
Ваш метод подходит для одного числа в строке.
А если их несколько и заранее неизвестно количество чисел в строке?
7. K_A_O 554 26.01.16 13:26 Сейчас в теме
6. pvlunegov 160 25.01.16 16:17 Сейчас в теме
Вы в курсе, что преобразовать число в строку - можно. См. пример http://v8.1c.ru/predpriyatie/typical_problems_Types.htm

А ОБРАТНАЯ ОПЕРАЦИЯ - СТРОКА В ЧИСЛО - НЕЛЬЗЯ!
Будет ошибка преобразования типов.

Это логично. Как вам интерпретатор преобразует "врп346вар" в число?
8. Lukich66 85 27.01.16 20:45 Сейчас в теме
Для полного "самоуспокоения" предусмотреть и вариант формирования дробных чисел в массиве
9. Diego_Iv 36 28.01.16 12:45 Сейчас в теме
Регулярные выражения - вещь!!!
Допиливал с их использованием обработку "Клиент-банк".

У нас в день 100-200 входящих платежек (поступление на расчетный счет).
У контрагента может быть от 1 до 10 действующих договоров. Все они приучены, что в назначении платежа обязательно указывают тот номер договора, по которому перечисляются деньги.

Теперь Клиент-банк распознает этот номер и правильно подставляет нужный договор в документ (ранее подставлялся договор, назначенный основным и приходилось вручную исправлять его, глядя на то, что написано в назначении платежа).
Теперь все делается "само", бухи счастливы.
Для отправки сообщения требуется регистрация/авторизация