Помогите плиз нужно отпарсить

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-09-30 9:30:51

Есть xml фаил такого типа

Код: Выделить всё

<?xml version='1.0'  encoding='Cp1251' ?>
<RESULTS>
	<ROW>
		<COLUMN NAME="AUFINFO2"><![CDATA[ОТН1-072354]]></COLUMN>
		<COLUMN NAME="LFAEMPFKDNR"><![CDATA[00787_2]]></COLUMN>
		<COLUMN NAME="DATE_TIME"><![CDATA[2011-08-29]]></COLUMN>
		<COLUMN NAME="ARTNR"><![CDATA[06527K202]]></COLUMN>
		<COLUMN NAME="AUPMGSOLL"><![CDATA[72]]></COLUMN>
		<COLUMN NAME="BSTQLF"><![CDATA[10]]></COLUMN>
		<COLUMN NAME="DATE_DZUPD"><![CDATA[2011-08-29]]></COLUMN>
	</ROW>
</RESULTS>
нужно привести к такому виду

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
<transaction version="1.0">
<Table:Record name="NewORDitems" row="1">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K202</Table:Field>
<Table:Field name="InventQty">72</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
</transaction>
</AxaptaXMLExport>
Причем <Table:Record name="NewORDitems" row="1"> меняется row="1" от количества <ROW>.
Пробовал так
#!/bin/bash
cat file.xml |\
sed 's/<ROW>/<Table:Record name=NewORDitems row=1>/g; s/<\/\ROW>/<Table:Record>/g; s/<COLUMN NAME="AUFINFO2"><!\[\CDATA/<Table:Field name="ExternalID">/g; s/\]]><\/\COLUMN>/<\/\Table:Field>/g; s/<COLUMN NAME="LFAEMPFKDNR"><!\[\CDATA/<Table:Field name="CustAccount">/g; s/<COLUMN NAME="DATE_TIME"><!\[\CDATA/<Table:Field name="CustAccount">/g; s/<COLUMN NAME="ARTNR"><!\[\CDATA/<Table:Field name="DeliveryDate">/g; s/<COLUMN NAME="AUPMGSOLL"><!\[\CDATA/<Table:Field name="InventQty">/g; s/<COLUMN NAME="BSTQLF"><!\[\CDATA/<Table:Field name="InventLocationID">/g; s/<COLUMN NAME="DATE_DZUPD"><!\[\CDATA/<Table:Field name="ManDate">/g;' \
>test.xml
Результат

Код: Выделить всё

<RESULTS>
	<Table:Record name=NewORDitems row=1>
		<Table:Field name="ExternalID">[ОТН1-072354</Table:Field>
		<Table:Field name="CustAccount">[00787_2</Table:Field>
		<Table:Field name="CustAccount">[2011-08-29</Table:Field>
		<Table:Field name="DeliveryDate">[06527K202</Table:Field>
		<Table:Field name="InventQty">[72</Table:Field>
		<Table:Field name="InventLocationID">[10</Table:Field>
		<Table:Field name="ManDate">[2011-08-29</Table:Field>
	<Table:Record>
Остается [

OS Ubuntu

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
J.Korvin
сержант
Сообщения: 232
Зарегистрирован: 2008-11-22 12:03:41

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение J.Korvin » 2011-09-30 16:52:45

А при поморщи библиотеки http://search.cpan.org/dist/XML-Parser/Parser.pm
Эсли ты с ножом значит ты с мясом.

ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-09-30 19:00:55

Это нужно реализовать виде скрипта можно еще такой вариант убрать все теги
ОТН1-072354 00787_2 2011-08-29 06527K202 72 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K203 73 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K204 74 10 2011-08-29
и можно от количеств строк будет зависеть <Table:Record name="NewORDitems" row="1">
то есть должно быть что то типо вот этого

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
<transaction version="1.0">
<Table:Record name="NewORDitems" row="1">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K202</Table:Field>
<Table:Field name="InventQty">72</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="2">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K203</Table:Field>
<Table:Field name="InventQty">73</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="3">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K204</Table:Field>
<Table:Field name="InventQty">74</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
</transaction>
</AxaptaXMLExport>

просто мне ни справится без помощи специалистов

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение rmn » 2011-09-30 21:31:58

Код: Выделить всё

remcomp% cat data.xml
<?xml version='1.0'  encoding='Cp1251' ?>
<RESULTS>
   <ROW>
      <COLUMN NAME="AUFINFO2"><![CDATA[OTH1-072354]]></COLUMN>
      <COLUMN NAME="LFAEMPFKDNR"><![CDATA[00787_2]]></COLUMN>
      <COLUMN NAME="DATE_TIME"><![CDATA[2011-08-29]]></COLUMN>
      <COLUMN NAME="ARTNR"><![CDATA[06527K202]]></COLUMN>
      <COLUMN NAME="AUPMGSOLL"><![CDATA[72]]></COLUMN>
      <COLUMN NAME="BSTQLF"><![CDATA[10]]></COLUMN>
      <COLUMN NAME="DATE_DZUPD"><![CDATA[2011-08-29]]></COLUMN>
   </ROW>
   <ROW>
      <COLUMN NAME="AUFINFO2"><![CDATA[OTH1-072354]]></COLUMN>
      <COLUMN NAME="LFAEMPFKDNR"><![CDATA[00787_2]]></COLUMN>
      <COLUMN NAME="DATE_TIME"><![CDATA[2011-08-29]]></COLUMN>
      <COLUMN NAME="ARTNR"><![CDATA[06527K202]]></COLUMN>
      <COLUMN NAME="AUPMGSOLL"><![CDATA[72]]></COLUMN>
      <COLUMN NAME="BSTQLF"><![CDATA[10]]></COLUMN>
      <COLUMN NAME="DATE_DZUPD"><![CDATA[2011-08-29]]></COLUMN>
   </ROW>
   <ROW>
      <COLUMN NAME="AUFINFO2"><![CDATA[OTH1-072354]]></COLUMN>
      <COLUMN NAME="LFAEMPFKDNR"><![CDATA[00787_2]]></COLUMN>
      <COLUMN NAME="DATE_TIME"><![CDATA[2011-08-29]]></COLUMN>
      <COLUMN NAME="ARTNR"><![CDATA[06527K202]]></COLUMN>
      <COLUMN NAME="AUPMGSOLL"><![CDATA[72]]></COLUMN>
      <COLUMN NAME="BSTQLF"><![CDATA[10]]></COLUMN>
      <COLUMN NAME="DATE_DZUPD"><![CDATA[2011-08-29]]></COLUMN>
   </ROW>
</RESULTS>

Код: Выделить всё

remcomp% cat script.sh 
#!/bin/sh

rowIndex="1"

cat data.xml | awk '{print $1,$2}' |
(
    while read v1 v2
    do
        case $v1 in
            "<RESULTS>")
                echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>"
                echo "<AxaptaXMLExport xmlns:Table=\"urn:www.navision.com/Formats/Table\" version=\"1.0\">"
                echo "<transaction version=\"1.0\">"
            ;;
            "</RESULTS>")
                echo "</transaction>"
                echo "</AxaptaXMLExport>"
                exit
            ;;
            "<ROW>")
                echo "  <Table:Record name=\"NewORDitems\" row=\"${rowIndex}\">"
            ;;
            "</ROW>")
                echo "  </Table:Record>"
                rowIndex="`expr $rowIndex + 1`"
            ;;
            "<COLUMN")
                fieldName=""
                echo $v2 | sed -e 's/NAME="//' -e 's/"><!\[CDATA\[/ /' -e 's/\]\]><\/COLUMN>//' | 
                (
                    read fieldName fieldValue
                
                    case $fieldName in
                        "AUFINFO2")
                            fieldName="PickingListId"
                        ;;
                        "LFAEMPFKDNR")
                            fieldName="CustAccount"
                        ;;
                        "DATE_TIME")
                            fieldName="DeliveryDate"
                        ;;
                        "ARTNR")
                            fieldName="Itemid"
                        ;;
                        "AUPMGSOLL")
                            fieldName="InventQty"
                        ;;
                        "BSTQLF")
                            fieldName="InventLocationID"
                        ;;
                        "DATE_DZUPD")
                            fieldName="ManDate"
                        ;;
                        *)
                            continue
                    esac
                
                    echo "              <Table:Field name=\"${fieldName}\">${fieldValue}</Table:Field>"
                )
            ;;
        esac
    done
)

Код: Выделить всё

remcomp% ./script.sh 
<?xml version="1.0" encoding="windows-1251"?>
<AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
<transaction version="1.0">
        <Table:Record name="NewORDitems" row="1">
                <Table:Field name="PickingListId">OTH1-072354</Table:Field>
                <Table:Field name="CustAccount">00787_2</Table:Field>
                <Table:Field name="DeliveryDate">2011-08-29</Table:Field>
                <Table:Field name="Itemid">06527K202</Table:Field>
                <Table:Field name="InventQty">72</Table:Field>
                <Table:Field name="InventLocationID">10</Table:Field>
                <Table:Field name="ManDate">2011-08-29</Table:Field>
        </Table:Record>
        <Table:Record name="NewORDitems" row="2">
                <Table:Field name="PickingListId">OTH1-072354</Table:Field>
                <Table:Field name="CustAccount">00787_2</Table:Field>
                <Table:Field name="DeliveryDate">2011-08-29</Table:Field>
                <Table:Field name="Itemid">06527K202</Table:Field>
                <Table:Field name="InventQty">72</Table:Field>
                <Table:Field name="InventLocationID">10</Table:Field>
                <Table:Field name="ManDate">2011-08-29</Table:Field>
        </Table:Record>
        <Table:Record name="NewORDitems" row="3">
                <Table:Field name="PickingListId">OTH1-072354</Table:Field>
                <Table:Field name="CustAccount">00787_2</Table:Field>
                <Table:Field name="DeliveryDate">2011-08-29</Table:Field>
                <Table:Field name="Itemid">06527K202</Table:Field>
                <Table:Field name="InventQty">72</Table:Field>
                <Table:Field name="InventLocationID">10</Table:Field>
                <Table:Field name="ManDate">2011-08-29</Table:Field>
        </Table:Record>
</transaction>
</AxaptaXMLExport>

ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-10-01 16:56:34

Спасибо большое все просто супер.
Есть возможность реализации второго условия
ОТН1-072354 00787_2 2011-08-29 06527K202 72 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K203 73 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K204 74 10 2011-08-29
и можно от количеств строк будет зависеть <Table:Record name="NewORDitems" row="1">
то есть должно быть что то типо вот этого

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
<transaction version="1.0">
<Table:Record name="NewORDitems" row="1">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K202</Table:Field>
<Table:Field name="InventQty">72</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="2">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K203</Table:Field>
<Table:Field name="InventQty">73</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="3">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K204</Table:Field>
<Table:Field name="InventQty">74</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
</transaction>
</AxaptaXMLExport>

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение rmn » 2011-10-01 18:25:22

ruslanstep1 писал(а):то есть должно быть что то типо вот этого
так это и получается. Смотри пример выше

ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-10-01 19:55:48

Нет иногда нужно просто данные перевести в xml формат.
данные выглядят так

Код: Выделить всё

ОТН1-072354 00787_2 2011-08-29 06527K202 72 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K203 73 10 2011-08-29
ОТН1-072354 00787_2 2011-08-29 06527K204 74 10 2011-08-29
и их нужно перевести в

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
<transaction version="1.0">
<Table:Record name="NewORDitems" row="1">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K202</Table:Field>
<Table:Field name="InventQty">72</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="2">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K203</Table:Field>
<Table:Field name="InventQty">73</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
<Table:Record name="NewORDitems" row="3">
<Table:Field name="PickingListId">ОТН1-072354</Table:Field>
<Table:Field name="CustAccount">00787_2</Table:Field>
<Table:Field name="DeliveryDate">2011-08-29</Table:Field>
<Table:Field name="Itemid">06527K204</Table:Field>
<Table:Field name="InventQty">74</Table:Field>
<Table:Field name="InventLocationID">10</Table:Field>
<Table:Field name="ManDate">2011-08-29</Table:Field>
</Table:Record>
</transaction>
</AxaptaXMLExport>

ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-10-01 19:58:53

rmn писал(а):
ruslanstep1 писал(а):то есть должно быть что то типо вот этого
так это и получается. Смотри пример выше
с этим примером все гуд СПАСИБО Ты всегда Выручаешь

ruslanstep1
мл. сержант
Сообщения: 92
Зарегистрирован: 2010-04-14 11:40:46

Re: Помогите плиз нужно отпарсить

Непрочитанное сообщение ruslanstep1 » 2011-10-02 2:02:44

по поводу второго вопроса решил вроде сам вот код

Код: Выделить всё

#!/bin/sh
echo "<?xml version=1.0 encoding=windows-1251?>"
echo "<AxaptaXMLExport xmlns:Table=\"urn:www.navision.com/Formats/Table\" version=\"1.0\">"
echo "<transaction version=\"1.0\">"
cat 1.txt | awk '{print $1,$2,$3,$4,$5,$6,$7}' | while read v1 v2 v3 v4 v5 v6 v7; do \
rowIndex="`expr $rowIndex + 1`"; \
echo "<Table:Record name=\"NewORDitems\" row=\"${rowIndex}\">"; \
echo "<Table:Field name=\"PickingListId\">$v1</Table:Field>"; \
echo "<Table:Field name=\"CustAccount\">$v2</Table:Field>" ; \
echo "<Table:Field name=\"DeliveryDate\">$v3</Table:Field>" ; \
echo "<Table:Field name=\"Itemid\">$v4</Table:Field>"; \
echo "<Table:Field name=\"InventQty\">$v5</Table:Field>"; \
echo "<Table:Field name=\"InventLocationID\">$v6</Table:Field>" ; \
echo "<Table:Field name=\"ManDate\">$v7</Table:Field>" ; \
echo "</Table:Record>" ;\
done;
echo "</transaction>" 
echo "</AxaptaXMLExport>"