Разбор строки Ключевые слова: рекурсия, парсер, разбор, строка
При анализе файлов приходится иногда осуществлять разбор строк, которые как правило состоят из поледовательности значений каких-либо полей, разделенных, например, запятыми.
Такая задача очень часто возникает при работе с логами СКУД-контроллеров. Возникает задача получить, например, значения 2-го, 5-го, 6-го поля в строке.
Для удобства решения задачи удобно преобразовывать строку в массив. Это можно сделать с помощью рекурсивной функции, так эта функция выглядит очень наглядно, красиво и лаконично.
Функция РазборСтроки(знач Стр, Массив, Разделитель) Экспорт
Поз = Найти(Стр, Разделитель);
Если Поз = 0 тогда
Массив.Добавить(Стр);
возврат Массив;
иначе
Массив.Добавить(Сред(Стр,1,Поз-1));
возврат РазборСтроки(Сред(Стр, Поз+СтрДлина(Разделитель), СтрДлина(Стр)-Поз-СтрДлина(Разделитель) + 1), Массив, Разделитель);
конецЕсли;
конецФункции
....
ТекСтр = "Мама,мыла,раму,раму,мыла,мама,раму,мама,мыла";
Массивчик = новый Массив;
Массивчик = РазборСтроки(ТекСтр, Массивчик, ",");
Позволяет разбирать строки, где в качестве разделителя - табуляция.
Казалось бы, всё красиво и понятно, однако, даже искушенные программисты порой решают подобные задачи через цикл, порождая громоздкий и некрасивый код
Похожая функция есть в моей библиотеке функций: http://infostart.ru/projects/2024/
Функция РазложитьСтрокуПоРазделителю(Знач С, Разделитель) Экспорт
//Назначение: Функция разберает строку с разделителем (любая подстрока) и каждое слово между разделителями вставляет в массив
//ДатаСоздания: 20080416
//Автор: Fixin
//Тестирована: Да
//Описание:
// Обертка для функции РазложитьСтрокуПоРазделителям для одного значения
Разделители = Новый Массив();
Разделители.Добавить(Разделитель);
Возврат РазложитьСтрокуПоРазделителям(С, Разделители);
КонецФункции
Функция РазложитьСтрокуПоРазделителям(Знач С, Разделители) Экспорт
//Назначение: Функция разберает строку с разделителями и каждое слово между разделителями вставляет в массив
//ДатаСоздания: 20070907
//Автор: sergeystav
//Редактор: Fixin
//$Разделители: массив строк, каждая из которых описывает разделитель
//Тестирована: Нет
//Описание:
// fixin заменил возвращаемый тип на массив вместо соотвествия и немного причесал
Перем Р, ЧислоВхождений, Инд, ПервоеВхождение;
Р=Новый Массив;
ТекС = С;
Пока Истина Цикл
МинПоз = Неопределено;
Для Каждого Разделитель ИЗ Разделители Цикл
Поз = Найти(ТекС, Разделитель);
Если Поз <> 0 И (МинПоз = Неопределено ИЛИ Поз < МинПоз) Тогда
МинПоз = Поз;
КонецЕсли;
КонецЦикла;
Если МинПоз = Неопределено Тогда
Р.Добавить(ТекС);
Возврат Р;
КонецЕсли;
Если МинПоз > 1 Тогда
Р.Добавить(Лев(ТекС, МинПоз-1));
КонецЕсли;
ТекС = Сред(ТекС, МинПоз + 1);
КонецЦикла;
КонецФункции
|