HelpF.pro

Выбор оптимального алгоритма для разбора строки в массив

Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных >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 = Неопределено;
КонецПроцедуры

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/989.html