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/faq8/view/989.html