Книга знаний

1С:Предприятие / Приемы программирования / Встроенный язык

Разбор строки

Решение тривиальной задачи - разбор строкиАвтор статьи: ИначеЕсли | Редакторы: Гений 1С
Последняя редакция №4 от 24.04.09 | История
URL: http://kb.mista.ru/article.php?id=592

Ключевые слова: рекурсия, парсер, разбор, строка


При анализе файлов приходится иногда осуществлять разбор строк, которые как правило состоят из поледовательности значений каких-либо полей, разделенных, например, запятыми.

Такая задача очень часто возникает при работе с логами СКУД-контроллеров. Возникает задача получить, например, значения 2-го, 5-го, 6-го поля в строке.

Для удобства решения задачи удобно преобразовывать строку в массив. Это можно сделать с помощью рекурсивной функции, так эта функция выглядит очень наглядно, красиво и лаконично.

Функция РазборСтроки(знач Стр, Массив, Разделитель) Экспорт
    Поз = Найти(Стр, Разделитель);
    Если Поз = 0 тогда
        Массив.Добавить(Стр);
        возврат Массив;
    иначе
        Массив.Добавить(Сред(Стр,1,Поз-1));
        возврат РазборСтроки(Сред(Стр, Поз+СтрДлина(Разделитель), СтрДлина(Стр)-Поз-СтрДлина(Разделитель) + 1), Массив, Разделитель);
    конецЕсли;
конецФункции

....

ТекСтр = "Мама,мыла,раму,раму,мыла,мама,раму,мама,мыла";
Массивчик = новый Массив;
Массивчик = РазборСтроки(ТекСтр, Массивчик, ",");


Позволяет разбирать строки, где в качестве разделителя - табуляция.

Казалось бы, всё красиво и понятно, однако, даже искушенные программисты порой решают подобные задачи через цикл, порождая громоздкий и некрасивый код

Похожая функция есть в моей библиотеке функций: http://infostart.ru/projects/2024/

Функция РазложитьСтрокуПоРазделителю(Знач С, Разделитель) Экспорт
//Назначение: Функция разберает строку с разделителем (любая подстрока) и каждое слово между разделителями вставляет в массив
//ДатаСоздания: 20080416
//Автор: Fixin
//Тестирована: Да
//Описание:
//    Обертка для функции РазложитьСтрокуПоРазделителям для одного значения

   Разделители = Новый Массив();
   Разделители.Добавить(Разделитель);
   
   Возврат РазложитьСтрокуПоРазделителям(С, Разделители);

КонецФункции

Функция РазложитьСтрокуПоРазделителям(Знач С, Разделители) Экспорт
//Назначение: Функция разберает строку с разделителями и каждое слово между разделителями вставляет в массив
//ДатаСоздания: 20070907
//Автор: sergeystav
//Редактор: Fixin
//$Разделители: массив строк, каждая из которых описывает разделитель
//Тестирована: Нет
//Описание:
//    fixin заменил возвращаемый тип на массив вместо соотвествия и немного причесал

   Перем Р, ЧислоВхождений, Инд, ПервоеВхождение;
   
   Р=Новый Массив;
   
   ТекС = С;
   Пока Истина Цикл
       МинПоз = Неопределено;
       Для Каждого Разделитель ИЗ Разделители Цикл
           Поз = Найти(ТекС, Разделитель);
           Если Поз <> 0 И (МинПоз = Неопределено ИЛИ Поз < МинПоз) Тогда
               МинПоз = Поз;
           КонецЕсли;
       КонецЦикла;
       Если МинПоз = Неопределено Тогда
           Р.Добавить(ТекС);
           Возврат Р;
       КонецЕсли;
       Если МинПоз > 1 Тогда
           Р.Добавить(Лев(ТекС, МинПоз-1));
       КонецЕсли;
       ТекС = Сред(ТекС, МинПоз + 1);
   КонецЦикла;
   
КонецФункции


Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика