Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 09:43

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

Автор Vladiwir, 22 авг 2014, 09:24

0 Пользователей и 1 гость просматривают эту тему.

Vladiwir

Имеется текстовый файл для загрузки Сотрудники.тхт :

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

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

&НаСервере
Процедура ЧтениеТекстаИзФайла()
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\ТХТ\Сотрудники.txt");

//Перебор строк текстового документа
Для НомерСтроки =1 По Текст.КоличествоСтрок() Цикл
    //Получить строку из файла с указанным номером
    Стр = Текст.ПолучитьСтроку(НомерСтроки);
    //Распарсивание строки
    //Ищем позицию символа разделителя
    Позиция = Найти(Стр,";");
    //Создаем новый эемент справочника
    Спр = Справочники.Сотрудники.СоздатьЭлемент();
    //В код записывается подстрока от первого символа до позиции символа-разделителя
    Спр.Код = Сред(Стр,1,Позиция-1);
    //За символом разделителем наименование Сотрудника
    Спр.Наименование = Сред(Стр,Позиция+1);
    ////За символом разделителем-Подразделение
    //Позиция = Найти(Стр,";"+1);
    //Подр = Сред(Стр,1,Позиция+1);
    //НайтиПодр = Найти(Подр,";");
    //Спр.Подразделение = Сред(Подр,1,НайтиПодр-1);
    //
    //Спр.Записать();
     
КонецЦикла;   

КонецПроцедуры

Во всех примерах в инете до второго разделителя- здесь все в порядке, а как вытащить Подразделение и Оклад.
Закомментированный код  не дает результата. Как Быть? Нужна помощь, заранее благодарен.

Kironten

Методом Найти() вы получите ТОЛЬКО первую позицию из найденных в строке.
Остальные разделители вы не редактируя строку не получите.
Поюзайте метод Прав().
Примерно алгоритм будет следующий:
Нашли первый разделитель.
Присвоили элементу справочника - код из строки.
Обрезали строку методом Прав() - в результате получили строку "Дураков.Д.Д;Управление;25000"
Опять нашли позицию первого разделителя
Присвоили элементу справочника - Наименование из строки
Опять обрезали строку методом Прав() в результате получили строку "Управление;25000"
Опять находите позицию разделителя.
Берете символы слева до разделителя и помещаете в подразделение, берете символы справа от разделителя и засовываете в оклад.
Все.

TreeDogNight

Думаю эта функция вам в этом случае поможет.
// Функция "расщепляет" строку на подстроки, используя заданный
//      разделитель. Разделитель может иметь любую длину.
//      Если в качестве разделителя задан пробел, рядом стоящие пробелы
//      считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
//      игнорируются.
//      Например,
//      РазложитьСтрокуВМассивПодстрок(",один,,,два", ",") возвратит массив значений из пяти элементов,
//      три из которых - пустые строки, а
//      РазложитьСтрокуВМассивПодстрок(" один   два", " ") возвратит массив значений из двух элементов
//
//  Параметры:
//      Стр -           строка, которую необходимо разложить на подстроки.
//                      Параметр передается по значению.
//      Разделитель -   строка-разделитель, по умолчанию - запятая.
//
//  Возвращаемое значение:
//      массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт

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

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск