Адрес этой странички : http://doc-prg.narod.ru/art_00101/art_00101.htm 
Дата обновления : 08.08.2009
 

(c) Sergey Popov, Usinsk, Komi, 2007

© 08.08.2009 Сергей Попов

1Cv7.
Некоторые полезные алгоритмы.
Строки-Тексты.

Статью в виде файла (8.6 кб) можно скачать здесь: art_00101.zip



1. Проверить вхождение символов из строки СтрокаСимв, в строку СтрокаАнализа.
При этом, проверка производится ПОСИМВОЛЬНО, а не в целом, по подстроке
//Функция возвращает 1, если хотя бы один символ из переменной СтрокаСимв входит в строку СтрокаАнализа

Функция сп_ВхождениеСимволовВСтроку(СтрокаСимв,СтрокаАнализа)
//Смотрим символы из СтрокаСимв и проверяем их на наличие в СтрокаАнализа
//Если хотя бы у одного символа есть вхождение - возващает 1
    Перем Res;
    Res = 0; //Возвращаемое значение
    Если СтрДлина(СтрокаСимв)>0 Тогда
        Если СтрДлина(СтрокаАнализа)>0 Тогда
            i=0;
            Пока i<СтрДлина(СтрокаСимв) Цикл
                i=i+1;
                S1=Сред(СтрокаСимв,i,1);
                Если Найти(СтрокаАнализа,S1)>0 Тогда
                    //Вхождение найдено
                    Res=1;
                    i=СтрДлина(СтрокаСимв)+1;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли; 
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_ВхождениеСимволовВСтроку

 

2. Удалить (слева) из строки ИсхСтрока все СИМВОЛЫ, которые заданы строкой НеСимволы
//Аналог стандартной функции СокрЛ(), но удаляет не только пробелы
//Функция возвращает "обработанную" строку

Функция сп_СокрЛ(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (слева) СИМВОЛЫ, входящие в НеСимволы
//Возвращает "обработанную" строку
    Перем Res; //строка, возвращаемое значение
    Перем Yes,i;
    Res = "";
    Если СтрДлина(ИсхСтрока)>0 Тогда
        Res = "";
        Yes=1;
        i=0;
        Пока i<СтрДлина(ИсхСтрока) Цикл
            i=i+1;
            S1=Сред(ИсхСтрока,i,1); //Считываем очередной символ из строки
            Если Yes>0 Тогда
                //Мы в начале строки - анализируем
                Если сп_ВхождениеСимволовВСтроке(S1,НеСимволы)>0 Тогда
                    //Этот символ из строки - НЕ символ - пропускаем
                Иначе 
                    //Этот символ из строки - нормальный СИМВОЛ, и больше строку мы НЕ анализируем
                    Yes=0;
                    Res=Res+S1;
                КонецЕсли;
            Иначе
                //Это уже НЕ в начале строки - просто считываем БЕЗ анализа
                Res=Res+S1;
            КонецЕсли;

        КонецЦикла;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_СокрЛ

 

3. Удалить (справа) из строки ИсхСтрока все символы, которые заданы строкой НеСимволы
//Аналог стандартной функции СокрП(), но удаляет не только пробелы
//Функция возвращает "обработанную" строку

Функция сп_СокрП(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (справа) СИМВОЛЫ, входящие в НеСимволы
//Возвращает "обработанную" строку
    Перем Res; //строка, возвращаемое значение
    Перем Yes,i;
    Res = "";
    Если СтрДлина(ИсхСтрока)>0 Тогда
        Res = "";
        Yes=1;
        i=СтрДлина(ИсхСтрока)+1;
        Пока i>1 Цикл
            i=i-1;
            S1=Сред(ИсхСтрока,i,1); //Считываем очередной символ из строки
            Если Yes>0 Тогда
                //Мы в конце строки - анализируем
                Если сп_ВхождениеСимволовВСтроке(S1,НеСимволы)>0 Тогда
                    //Этот символ из строки - НЕ символ - пропускаем
                Иначе 
                    //Этот символ из строки - нормальный СИМВОЛ, и больше строку мы НЕ анализируем
                    Yes=0;
                    Res=S1+Res;
                КонецЕсли;
            Иначе
                //Это уже НЕ в конце строки - просто считываем БЕЗ анализа
                Res=S1+Res;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_СокрП


4. Удалить (слева и справа) из строки ИсхСтрока все символы, которые заданы строкой НеСимволы
//Аналог стандартной функции СокрЛП(), но удаляет не только пробелы
//Функция возвращает "обработанную" строку

Функция сп_СокрЛП(НеСимволы,ИсхСтрока)
//Удалить НеСимволы слева и справа
//Возвращает "обработанную" строку
    Перем Res; //строка
    Res=сп_СокрЛ(НеСимволы,ИсхСтрока);
    Res=сп_СокрП(НеСимволы,Res);
    Возврат Res;
КонецФункции //сп_СокрЛП

 

5. Инвертировать строку
//Преобразование: "32а65"  -> "56а23"
//Функция возвращает "обработанную" строку

Функция сп_ИнвертироватьСтроку(ИсхСтрока)
    Перем Res; //строка 
    Перем i;
    Res="";
    Если СтрДлина(ИсхСтрока)>0 Тогда
        i=0;
        Пока i<СтрДлина(ИсхСтрока) Цикл
            i=i+1;
            S1=Сред(ИсхСтрока,i,1); //Считываем очередной символ из строки
            Res=S1+Res; //Инвертируем
        КонецЦикла;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_ИнвертироватьСтроку

 

6. Удалить (слева) из строки ИсхСтрока - СТРОКУ НеСимволы, если она есть (точное сравнение)
//Функция возвращает "обработанную" строку

Функция сп_СокрЛстр(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (слева) строку НеСимволы, если она есть
//Возвращает "обработанную" строку
    Перем Res; //строка
    Перем N1,N2,i;
    Res = "";
    Если СтрДлина(ИсхСтрока)>0 Тогда
        Если СтрДлина(НеСимволы)>0 Тогда
            Res = "";
            //Проверим, есть ли строка НеСимволов в строке ИсхСтрока вообще
            N1=Найти(ИсхСтрока,НеСимволы);
            N2=N1+СтрДлина(НеСимволы)-1;
            Если N1=1 Тогда //Есть и она в начале строки
                i = 0;
                Пока i<СтрДлина(ИсхСтрока) Цикл
                    i=i+1;
                    S1=Сред(ИсхСтрока,i,1); //Считываем очередной символ из строки
                    Yes=0;
                    Если i>=N1 Тогда
                        Если i<=N2 Тогда
                            //Мы еще в области НеСимволов в начале строки - пропускаем символ
                            Yes=1;
                        КонецЕсли;
                    КонецЕсли;
                    Если Yes<=0 Тогда
                        //Просто копируем символы 
                        Res=Res+S1;
                    КонецЕсли;
                КонецЦикла;
            Иначе
                //НеСимволы НЕ в начале строки
                Res = ИсхСтрока; 
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_СокрЛстр


7. Удалить (справа) из строки ИсхСтрока - СТРОКУ НеСимволы, если она есть (точное сравнение)
//Функция возвращает "обработанную" строку

Функция сп_СокрПстр(НеСимволы,ИсхСтрока) 
//Удалить из строки ИсхСтрока (справа) строку НеСимволы, если она есть
//Возвращает "обработанную" строку
    Перем Res; //строка
    Res=ИсхСтрока;
    //Инвертируем строки, чтобы использовать функцию сп_СокрЛстр
    НеСимволы = сп_ИнвертироватьСтроку(НеСимволы); 
    Res = сп_ИнвертироватьСтроку(Res);
    Res = сп_СокрЛстр(НеСимволы,Res);
    Res = сп_ИнвертироватьСтроку(Res); //Еще раз инвертируем результат
    НеСимволы = сп_ИнвертироватьСтроку(НеСимволы); //Вернем на место, на всякий случай
    Возврат Res;
КонецФункции //сп_СокрПстр

 

8. Удалить (слева и справа) из строки ИсхСтрока - СТРОКУ НеСимволы, если она есть (точное сравнение)
//Функция возвращает "обработанную" строку

Функция сп_СокрЛПстр(НеСимволы,ИсхСтрока)
//Удалить НеСимволы слева и справа
//Возвращает "обработанную" строку
    Перем Res; //строка
    Res=сп_СокрЛстр(НеСимволы,ИсхСтрока);
    Res=сп_СокрПстр(НеСимволы,Res);
    Возврат Res;
КонецФункции //сп_СокрЛП


9. В некоторых случаях бывает полезным "работать" с текстовой структурой хранения инфы по типу стандартных INI-файлов (разделы-параметры).
Эта функция позволяет считывать весь РАЗДЕЛ по его имени
//ИмяРаздела - имя раздела, как он задан (регистр символов не имеет значения), переменная типа СТРОКА
//ИмпТекст - СЧИТАННЫЙ  "INI-файл" (переменная типа ТЕКСТ)
//ИмпРаздел - найденный раздел (переменная типа ТЕКСТ)
//Сама Функция возвращает кол-во параметров в РАЗДЕЛЕ.
Пример :
Содержание переменной ИмпТекст :
[СЛУЖЕБНАЯ]
КолвоРеквШапка=14
КолвоСтрокТабл=3
КолвоРеквТабл=10

[ШАПКА]
Склад="Склад ОКС",11,"Склады","00001","00001"
Валюта="руб.",11,"Валюты","810","810"
Курс="1",1,"","",""
МатОтветст="Турковский А.А.",11,"ФизЛица","00000005","00000002/00000005"
МестоПрибытия="АБК управл.по тр-у хоз.способ",2,"","",""
Разрешение="Матвеев В.В.",11,"ФизЛица","00000007","00000002/00000007"
ДатаРазр="01.11.02",3,"","",""
Кладовщик="Лазарева Р.Р.",11,"ФизЛица","00000006","00000001/00000006"

Примененим функцию : 
сп_ПолучитьРазделИзИмпорта("ШАПКА",ИмпТекст,ИмпРаздел);

Содержание переменной ИмпРаздел :
Склад="Склад ОКС",11,"Склады","00001","00001"
Валюта="руб.",11,"Валюты","810","810"
Курс="1",1,"","",""
МатОтветст="Турковский А.А.",11,"ФизЛица","00000005","00000002/00000005"
МестоПрибытия="АБК управл.по тр-у хоз.способ",2,"","",""
Разрешение="Матвеев В.В.",11,"ФизЛица","00000007","00000002/00000007"
ДатаРазр="01.11.02",3,"","",""
Кладовщик="Лазарева Р.Р.",11,"ФизЛица","00000006","00000001/00000006"

Функция сп_ПолучитьРазделИзИмпорта(ИмяРаздела,ИмпТекст,ИмпРаздел)
    Перем i,КолВоСтрок,МыВРазделе,МыВНашемРазделе;
    МыВРазделе = 0;
    МыВНашемРазделе = 0;
    ИмпРаздел.Очистить();
    ИмяРаздела=Врег(СокрЛП(ИмяРаздела)); //Преобразуем в верхний регистр
    Если СтрДлина(ИмяРаздела)>0 Тогда
        //Имя Раздела задано
        КолВоСтрок=ИмпТекст.КоличествоСтрок();
        Если КолвоСтрок>0 Тогда
            МыВРазделе = 0;
            МыВНашемРазделе = 0;
            i=0;
            Пока i<КолВоСтрок Цикл
                i=i+1;
                Sx=ИмпТекст.ПолучитьСтроку(i);
                S1=СокрЛП(Sx);
                Если СтрДлина(S1)>0 Тогда
                    Если МыВРазделе>0 Тогда //Мы в разделе каком-то
                        Если МыВНашемРазделе>0 Тогда //Мы в НАШЕМ разделе - считываем раздел
                            ИмпРаздел.ДобавитьСтроку(Sx); 
                        КонецЕсли;
                    Иначе
                        //Строка НЕ пустая и мы НЕ знаем, что мы в разделе
                        //Проверяем, это вообще раздел или черте что и сбоку бантик ?
                        S1=Врег(СокрЛП(S1));
                        Если СтрДлина(S1)>0 Тогда
                            Если Лев(S1,1)="[" Тогда //Это раздел вроде бы
                                МыВРазделе = 1;
                                //Проверим, это наш раздел ?
                                МыВНашемРазделе = 0;
                                S1=СтрЗаменить(S1,"["," "); //Удалим признак раздела слева
                                S1=СтрЗаменить(S1,"]"," "); //Удалим признак раздела справа
                                S1=Врег(СокрЛП(S1)); 
                                Если СтрДлина(S1)>0 Тогда
                                    Если S1=ИмяРаздела Тогда //Мы именно в НАШЕМ разделе
                                        МыВНашемРазделе = 1;
                                    КонецЕсли; 
                                КонецЕсли; 
                            КонецЕсли; 
                        КонецЕсли; 
                    КонецЕсли;
                Иначе
                    //Строка пустая, следовательно мы ВНЕ любого раздела
                    МыВРазделе = 0;
                    МыВНашемРазделе = 0;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли; 
    Возврат ИмпРаздел.КоличествоСтрок();
КонецФункции//сп_ПолучитьРазделИзИмпорта

 

10. Выделить из строки вида :
ИмяПарам=ЗначПарам
Имя и значение параметра.
Эта функция предназначена для "работы" с текстовой структурой хранения инфы по типу стандартных INI-файлов (разделы-параметры).

//ИсхСтрока - строка из соотв. раздела (переменная типа СТРОКА)
//ИмяПарам - возвращаемое значение (строка)
//ЗначПарам - возвращаемое значение (строка)
//Сама Функция возвращает 1, если задано хотя ИмяПараметра

Пример.
ИсхСтрока :
Номенклатура="Светильник ЛСП 02 2х40",11,"Номенклатура","00017247","00000021/00000063/00002913/00009659/00017247"
После разделения :
ИмяПарам = Номенклатура
ЗначПарам= "Светильник ЛСП 02 2х40",11,"Номенклатура","00017247","00000021/00000063/00002913/00009659/00017247"


Функция сп_ВыделитьИмяИЗначениеПараметраИзСтроки(ИсхСтрока, ИмяПарам, ЗначПарам)
//Анализирует и разделяет строку вида :
//ИмяПараметра=Какое-то значение параметра
    Перем Res,N;
    Перем Sx;
    Res=0; 
    Sx=СокрЛП(ИсхСтрока);
    ИмяПарам="";
    ЗначПарам="";
    N=Найти(Sx,"=");
    Если N>0 Тогда //Это "наша" строка
        S1=Лев(Sx,1); //Выделим левый крайний символ
        Если S1<>"[" Тогда //Это НЕ имя раздела
            ИмяПарам = Лев(Sx,N); //Выделяем имя параметра
            Если СтрДлина(Sx)>N Тогда //В правой части что-то есть
                ЗначПарам = Прав(Sx,СтрДлина(Sx)-N); //Выделяем знач.параметра
            КонецЕсли;
            ЗначПарам=СокрЛП(ЗначПарам); 
            ИмяПарам=СокрЛП(ИмяПарам);
            ИмяПарам=СтрЗаменить(ИмяПарам,"="," "); //Удаляем из имени параметра знак равенства
            ИмяПарам=СокрЛП(ИмяПарам);
            Если СтрДлина(ИмяПарам)>0 Тогда //Имя Параметра корректно
                Res=1;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_ВыделитьИмяИЗначениеПараметраИзСтроки

 

11. Когда раздел уже считан (см функцию сп_ПолучитьРазделИзИмпорта), то нижеприведенная функция находит и возвращает значение параметра по его имени.
//ИмяПарам - заданное имя параметра (строка). Регистр символов не имеет значения
//ИмпРаздел - найденный раздел (с помощью сп_ПолучитьРазделИзИмпорта).
//ЗначПарам - возвращаемое значение параметра (строка)
//Сама Функция возвращает 1, если заданный параметр есть в этом разделе

Функция сп_ПолучитьЗначПараметраИзРаздела(ИмяПарам,ЗначПарам,ИмпРаздел)
    Перем Res,i,КолВоСтрок; //целые
    Перем ИП,ИмПарам; //строки
    Res = 0;
    ЗначПарам="";
    ИмПарам=ВРег(СокрЛП(ИмяПарам));
    Если СтрДлина(ИмПарам)>0 Тогда 
        ИП="";
        КолВоСтрок=ИмпРаздел.КоличествоСтрок();
        Если КолвоСтрок>0 Тогда
            i=0;
            Пока i<КолВоСтрок Цикл
                i=i+1;
                Sx=ИмпРаздел.ПолучитьСтроку(i);
                ИП="";
                ЗначПарам="";
                Если сп_ВыделитьИмяИЗначениеПараметраИзСтроки(Sx, ИП,ЗначПарам)>0 Тогда
                    ИП=ВРег(СокрЛП(ИП));
                    Если ИП=ИмПарам Тогда //Это НАШ параметр
                        Res = 1;
                        i=КолВоСтрок+1; //Выход из цикла
                    Иначе
                        ЗначПарам="";
                    КонецЕсли;
                Иначе
                    ЗначПарам="";
                КонецЕсли;
            КонецЦикла; 
        КонецЕсли;
    КонецЕсли;
    ЗначПарам = СокрЛП(ЗначПарам);
    Возврат Res;
КонецФункции //сп_ПолучитьЗначПараметраИзРаздела

 

 

© 08.08.2009 Сергей Попов

 


Hosted by uCoz
-->