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 = Неопределено;
КонецПроцедуры
   
Разместил:   Версии: | 7.x | 8.x | 8.2 УП |  Дата:   Прочитано: 21917
 0 
Распечатать
Возможно, вас также заинтересует
Замена текста в автофигуре word 2
Есть документ Word. Заполняю программно: TextFind.Execute(" " , Ложь, Истина, Ложь, , , Истина, , Ложь, " test" , 2); Текст находится в таблице, которая находится в автофигуре. Почему-то текст не заменяется, хотя вне
Получение уникального идентификатора ссылки в СКД 0
Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора
Циклы в языке 1С, примеры и тест - какой цикл быстрее? 6
Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле: Перебираем строки с помощью цикла Для каждого Для каждого ТекСтрока Из КоллекцияСтрок Цикл // код обработки КонецЦикла; Перебираем строки
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!