8.х Загрузка из текстового файла (распарсивание строки)

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Vladiwir, 22 авг 2014.

  1. TopicStarter Overlay
    Vladiwir
    Offline

    Vladiwir

    Регистрация:
    13 фев 2014
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Имеется текстовый файл для загрузки Сотрудники.тхт :

    000000004;Дураков Д.Д.;Управление;25 000
    000000003;Козлов Н.П.;Управление;28 000
    000000001;Петров П.П.;Склады;20 000
    000000002;Сидоров П.П.;Управление;15 000

    Процедура обработки загрузки:

    Код:
    &НаСервере
    Процедура ЧтениеТекстаИзФайла()
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("C:\ТХТ\Сотрудники.txt");
    
    //Перебор строк текстового документа
    Для НомерСтроки =1 По Текст.КоличествоСтрок() Цикл
        //Получить строку из файла с указанным номером
        Стр = Текст.ПолучитьСтроку(НомерСтроки);
        //Распарсивание строки
        //Ищем позицию символа разделителя
        Позиция = Найти(Стр,";");
        //Создаем новый эемент справочника
        Спр = Справочники.Сотрудники.СоздатьЭлемент();
        //В код записывается подстрока от первого символа до позиции символа-разделителя
        Спр.Код = Сред(Стр,1,Позиция-1);
        //За символом разделителем наименование Сотрудника
        Спр.Наименование = Сред(Стр,Позиция+1);
        ////За символом разделителем-Подразделение
        //Позиция = Найти(Стр,";"+1);
        //Подр = Сред(Стр,1,Позиция+1);
        //НайтиПодр = Найти(Подр,";");
        //Спр.Подразделение = Сред(Подр,1,НайтиПодр-1);
        //
        //Спр.Записать();
       
    КонецЦикла;  
    
    КонецПроцедуры
    Во всех примерах в инете до второго разделителя- здесь все в порядке, а как вытащить Подразделение и Оклад.
    Закомментированный код не дает результата. Как Быть? Нужна помощь, заранее благодарен.
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Код:
    БлокПроверки = "";
    Для i=1 По Текст.ПолучитьСтроку(НомерСтроки) Цикл
                ТекущийСимвол = Прав(Лев(СтрокаПроверки, i), 1);
                Если ТекущийСимвол = ";" Тогда // Разделитель
                    // бла бла бла
                КонецЕсли;
                БлокПроверки = БлокПроверки + ТекущийСимвол;
            КонецЦикла;
    
    Смекаете?
  3. TopicStarter Overlay
    Vladiwir
    Offline

    Vladiwir

    Регистрация:
    13 фев 2014
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    А поконкретнее, если можно, применительно к моему коду.
  4. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Чтож я сегодня добрый то такой
    Код:
    &НаСервере
    Процедура ЧтениеТекстаИзФайла()
       
        Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать("C:\ТХТ\Сотрудники.txt");
    
        //Перебор строк текстового документа
        Для НомерСтроки =1 По Текст.КоличествоСтрок() Цикл
            //Получить строку из файла с указанным номером
            ОбрабатываемаяСтрока = Текст.ПолучитьСтроку(НомерСтроки);
           
            БлокПроверки = "";
            Счетчик = 0;
            Для i=1 По СтрДлина(ОбрабатываемаяСтрока) Цикл
                ТекущийСимвол = Прав(Лев(ОбрабатываемаяСтрока, i), 1);
                Если ТекущийСимвол = ";" Тогда // Разделитель
                    Если Счетчик = 0 Тогда
                        // начинаем обрабатывать код сотрудника
                        КодСотрудника = БлокПроверки;
                    КонецЕсли;
                    Если Счетчик = 1 Тогда
                        // начинаем обрабатывать имя сотрудника
                        ИмяСотрудника = БлокПроверки;
                    КонецЕсли;
                    Если Счетчик = 2 Тогда
                        // начинаем обрабатывать подразделение сотрудника
                        ПодразделениеСотрудника = БлокПроверки;
                    КонецЕсли;
                    Если Счетчик = 3 Тогда
                        // начинаем обрабатывать оклад сотрудника
                        ОкладСотрудника = БлокПроверки;
                    КонецЕсли;
                    Счетчик = Счетчик + 1;
                    БлокПроверки = "";
                    Продолжить;
                КонецЕсли;
                БлокПроверки = БлокПроверки + ТекущийСимвол;
            КонецЦикла;
        КонецЦикла;
    
    КонецПроцедуры
  5. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    все проще: СтрЗаменить(ТекСтрока, ";", Символы.ПС)
    --- Объединение сообщений, 22 авг 2014 ---
    в одну строчку ;)
  6. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Писал на коленке, так что могут быть ошибки.
    --- Объединение сообщений, 22 авг 2014 ---
    Для какой цели все в одну строку преобразовывать?
  7. TopicStarter Overlay
    Vladiwir
    Offline

    Vladiwir

    Регистрация:
    13 фев 2014
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    nbipkuh_bah9i Благодарю за помощь!
  8. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
     
        МногострочнаяСтрока = СтрЗаменить(ТекСтрока, ";", Символы.ПС);
        сообщить(СтрПолучитьСтроку(МногострочнаяСтрока,1));
     
    КонецПроцедуры
    --- Объединение сообщений, 22 авг 2014 ---
    чтобы разбить строку на слова без извращений.
    Последнее редактирование модератором: 22 авг 2014
  9. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Не увидел Символы.ПС :)
  10. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    ну точнее не на слова, а на необходимые составляющие между разделителями

    PS
    а можно оформить и пользовать функцию в которую передавать строку и разделитель, для универсальности
  11. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Сколько раз хотел такую написать. И все время забывал :)
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не надо изобретать велосипеды:
    Код:
    СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок();
    ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок();
    
    nbIpKuH_BaH9I нравится это.
  13. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Во тупни то :)
  14. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    ну так и говорю же оформить и пользовать :)
    можно писать самому, можно из типовой выдрать.
    в типовых оно есть, а в самописных?

    да и великовата она :)
    Код:
    // Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
    //
    // Параметры:
    //  Строка                 - Строка - текст с разделителями;
    //  Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
    //  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
    //    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
    //     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
    //       включаются в результат.
    //     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
    //       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
    //       при других разделителях результатом функции будет пустой массив.
    //  СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
    //
    // Возвращаемое значение:
    //  Массив - массив строк.
    //
    // Примеры:
    //  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых  - пустые строки;
    //  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
    //  РазложитьСтрокуВМассивПодстрок(" один   два  ", " ") - возвратит массив из двух элементов;
    //  РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
    //  РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
    //  РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
    //
    Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт
       
        Результат = Новый Массив;
       
        // для обеспечения обратной совместимости
        Если ПропускатьПустыеСтроки = Неопределено Тогда
            ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
            Если ПустаяСтрока(Строка) Тогда
                Если Разделитель = " " Тогда
                    Результат.Добавить("");
                КонецЕсли;
                Возврат Результат;
            КонецЕсли;
        КонецЕсли;
        //
       
        Позиция = Найти(Строка, Разделитель);
        Пока Позиция > 0 Цикл
            Подстрока = Лев(Строка, Позиция - 1);
            Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
                Если СокращатьНепечатаемыеСимволы Тогда
                    Результат.Добавить(СокрЛП(Подстрока));
                Иначе
                    Результат.Добавить(Подстрока);
                КонецЕсли;
            КонецЕсли;
            Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
            Позиция = Найти(Строка, Разделитель);
        КонецЦикла;
       
        Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
            Если СокращатьНепечатаемыеСимволы Тогда
                Результат.Добавить(СокрЛП(Строка));
            Иначе
                Результат.Добавить(Строка);
            КонецЕсли;
        КонецЕсли;
       
        Возврат Результат;
       
    КонецФункции
    
    --- Объединение сообщений, 22 авг 2014 ---
    там ещё есть подобные
    "Функция РазложитьСтрокуВМассивСлов(Знач Строка, РазделителиСлов = Неопределено) Экспорт"

    хм, а этой "ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок();" нет в типовой УТ11 текущей
    Последнее редактирование: 22 авг 2014

Поделиться этой страницей