helpf.pro
Регистрация
 0 
Распечатать

1С 7.x : Выбор оптимального алгоритма для разбора строки в массив

Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных >100 000 строк. Как сделать бытсрее?
Код 1C v 8.х
  // Пример Defender aka LINN
ВремяНачала = ТекущаяДата();
Сообщить("Обработка начата: " + ВремяНачала);

ТЗ = Новый ТаблицаЗначений;
Текст = ПолучитьМакет("Макет").ПолучитьТекст();

RE = New COMObject("VBScript.RegExp");
RE.Global = Истина;
RE.IgnoreCase = Истина;
RE.Multiline = Истина;

RE.Pattern = "^.*$";

Строки = RE.Execute(Текст);

RE.Pattern = "([^\|]+?|\|)(?=\|)";

ДобавитьКолонки = Истина;

Для Каждого СтрокаТекста из Строки Цикл
СтрокаДляРазбора = СтрокаТекста.Value;

Результат = RE.Execute(СтрокаДляРазбора);

Если ДобавитьКолонки Тогда
НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл
НомерКолонки = НомерКолонки + 1;
ТЗ.Колонки.Добавить("Колонка" + НомерКолонки);
КонецЦикла;
ДобавитьКолонки = Ложь;
КонецЕсли;

НоваяСтрока = ТЗ.Добавить();

НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл

Значение = Совпадение.Value;

НоваяСтрока[НомерКолонки] = ?(Значение = "|", "", Значение);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецЦикла;

ВремяОкончания = ТекущаяДата();

Сообщить("Обработка завершена: " + ВремяОкончания + ", время обработки: " + Формат('00010101' + (ВремяОкончания-ВремяНачала), "ДФ=мм:сс"));
Сообщить("Количество строк: " + ТЗ.Количество());


Код 1C v 8.х
 // Пример  aleks-id
Функция InitRegExp(Разделитель = "|")
RegExp = Новый COMОбъект("VBScript.RegExp");

//Параметры:
RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске

RegExp.Pattern = "[^\" + Разделитель + "]+";
Возврат RegExp;
КонецФункции

Функция РазложитьСтрокуВМассив(RegExp, Строка)

Matches = RegExp.Execute (Строка);

Массив = Новый Массив;

Для Сч = 0 По Matches.Count - 1 Цикл
Массив.Добавить(Matches.Item(Сч).Value);
КонецЦикла;


Возврат Массив;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
Текст = Новый ЧтениеТекста("C:\aktivy.txt", КодировкаТекста.ANSI);
RegExp = InitRegExp();
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
масс = РазложитьСтрокуВМассив(RegExp, Стр);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
RegExp = Неопределено;
КонецПроцедуры
Разместил:   Версии: | 7.x | 8.x | 8.2 УП |  Дата:   Прочитано: 21846
 0 
Распечатать
Возможно, вас также заинтересует
Циклы в языке 1С, примеры и тест - какой цикл быстрее? 6
Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле: Перебираем строки с помощью цикла Для каждого Для каждого ТекСтрока Из КоллекцияСтрок Цикл // код обработки КонецЦикла; Перебираем строки
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.