gifts2017

Обработка данных XML в СSV. Замена поля. Простой практический пример

Опубликовал Vladimir Urusov (uvsd2014) в раздел Программирование - Практика программирования

В наше время часто ставится задача работы с данными форматов XML и CSV.
Первый формат файлов широко используется в самых разных программных системах для выгрузки и загрузки нетабличных данных (т.е. данных представленных в виде дерева).
Второй формат часто используется в интернет-магазинах для загрузки данных.
Иногда актуальной становится задача обновления данных формата CSV из файла XML.
Решению этой задачи и посвящена данная статья.

Обработка на основании данных из файла XML меняет цены в файле CSV по полю id

Кроме того, формируется файл rezult.csv из найденных в CSV - файле позиций.

Рисунок дерева сформирован на основании обработки

http://infostart.ru/public/14610/    -  XML viewer для 1С 8.*

 

Основная обработка файла xml и модификация файла Csv осуществляется в этом блоке программы:

 

 

Пока Чтение.Прочитать() Цикл

    // Прочитать "структурные части" элементов.  
    // Проверить, какая часть элемента - текущая.
    //СтрокаВывода = "";
    
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя;
        
            // Атрибуты элементов можно читать только если текущая часть -  
            // начало элемента
            
        Пока Чтение.ПрочитатьАтрибут() Цикл

            // Прочитать данные узла атрибута.  
            ТипУзла = Чтение.ТипУзла;
            Имя = Чтение.Имя;
            Значение = СокрЛП(Чтение.Значение);
              Если (ИмяУзла="offer") И (Имя="id") Тогда
                БлокОффер.Вставить("id", Значение);
            Endif;
 
        КонецЦикла;
    

    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда

             Если (ИмяУзла="price") Тогда
                БлокОффер.Вставить("price", Чтение.Значение);
            Endif;
            Если (ИмяУзла="model") Тогда
                БлокОффер.Вставить("model", Чтение.Значение);
             Endif;

        
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

       Если ИмяУзла = "param" Тогда  
           
            Если БлокОффер.Получить("id") <> Неопределено Тогда
                
                iddg=БлокОффер.Получить("id");
                idfl = iddg;
               
                Если idfl = Неопределено Тогда
                    zmodel = УбрПустые(БлокОффер.Получить("model"));
                    zzmodel = zmodel;
                    lmodel = Транслит(zzmodel);
                    Сообщить("Товар ( "+lmodel+" ) с кодом "+iddg +" Не найден");
                    СтрокаВывода="";
                Иначе
                    idfl = СокрЛП( idfl );
                    СтрокаВывода = СтрокаВывода +idfl+";;";
                КонецЕсли;

            КонецЕсли;
            
            Если БлокОффер.Получить("model") <> Неопределено Тогда
                zmodel = УбрПустые(БлокОффер.Получить("model"));
                zzmodel = zmodel;
                lmodel = Транслит(zzmodel);
                СтрокаВывода = СтрокаВывода +lmodel+";"+zmodel+";"+БлокОффер.Получить("price")+";";
                   Если idfl <> Неопределено Тогда
                       Попытка
                           ПорядкН99= Число(idfl);
                           Лист.Cells(ПорядкН99, 4).Value = БлокОффер.Получить("price");
                                                   
                       Исключение
                           Сообщить("не преобраз."+idfl);
                        КонецПопытки;
                   КонецЕсли;

                
                // ***
                КонецЕсли;
            
            Если НЕ ПустаяСтрока(СтрокаВывода) Тогда
                Текст.ДобавитьСтроку(СтрокаВывода);
                СтрокаВывода="";
                ВсегоЗаписей = ВсегоЗаписей + 1;
            КонецЕсли;
            
            
            
            БлокОффер.Очистить();
            
        КонецЕсли;


    КонецЕсли;
   
ВсегоЦиклов = ВсегоЦиклов + 1;
КонецЦикла;

=====

 

В программе используются функции перевода строки в Транслит и убирание пустых символов.

На основании этого макета обработки можно составить любые программы обновления файлов Csv из файлов формата xml

Благодарю за внимание.

 

Скачать файлы

Наименование Файл Версия Размер
Обработка данных XML в СSV . Замена поля. Простой практический пример. 6
.epf 10,38Kb
16.02.15
6
.epf 10,38Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Яков Коган (Yashazz) 17.02.15 09:18
Я бы для такой задачи использовал xslt-преобразование и, возможно, регулярные выражения. Было бы и универсально, и быстрее, чем в циклах.
2. Vladimir Urusov (uvsd2014) 17.02.15 09:52
(1) Yashazz, Да, возможно, но не все понимают эту технологию. Пример в статье именно отличается простотой и доступностью для изменения и не требует дополнительных усилий, чтобы вникнуть в тонкости xslt-преобразования
Чтобы подготовить небольшой участок земли к посадке весной вовсе не обязательно вызывать трактор.

Будьте добры - приведите пример как можно эту программу изменить с использованием xslt-преобразования
3. Яков Коган (Yashazz) 17.02.15 10:58
(2) Фраза
На основании этого макета обработки можно составить любые программы обновления файлов Csv из файлов формата xml
говорит о претензии на нечто большее, чем вскапывание огородика на 6 сотках))

Пишите в личку, обсудим стоимость, если это для вас актуально.
4. Vladimir Urusov (uvsd2014) 17.02.15 11:16
Извините, но мне собственно говоря не нужна Ваша программа - это программа вполне работоспособна и устраивает и клиентов и меня.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа