Včera jsem zpracovával XML feed, který měl část dat ve formátu Google Nákupy. Obsahoval elementy g:price
a g:sale_price
. Na výstupu jsem potřeboval element s cenou jediný, PRICE_VAT
přičemž jsem do něj potřeboval zapsat nižší ze vstupních cen. Blending Bull nebyl navržen, aby řešil porovnávání hodnot, výpočty a podobně. K tomu se hodí Mergado. Je to v něm ale možné vyřešit? Někdy by se to hodit mohlo. Inu jde. A zde je postup.
Problém
Ve vstupním datovém zdroji jsou u položek zboží item
elementy g:price
a g:price
. Ten první, základní cena, je u všech položek zboží. Cena zlevněná je nepovinná. Pokud uvedena je, obsahuje cenu nižší, než je cena základní. Mohou tedy nastat tyto situace:
- g:price, g:sale_price - uvedeny jsou oba elementy, obsahují různá čísla, přičemž g:sale_price je nižší
- g:price - uvedena je pouze cena základní
Řešení
Blending Bull neumí porovnávat čísla. Neumí ani podmínky, které by řekly “pokud je g:sale_price uvedena tak ji vezmii a pokud není, tak vezmi g:price”. Dokážeme však definovat pořadí znaků za sebou. Toho využijeme.
1) Zarovnat XML do tabulky
Njprve si data naformátujeme tak, aby se nám s nimi dobře pracovalo. Návod viz Jak zarovnat XML feed do “tabulky”.
2) Stanovit pořadí elementů g:price a g:sale_price
Viz návod Jak stanovit pořadí elementů v XML feedu. Za element <item>
zapíšeme element g:price
. Následně hned za <item>
zapíšeme g:sale_price
. Tím odsuneme g:price na druhé místo.
1) pravidlo, pořadí g:price
Název: order - g:price
Typ: Najít a narhadit
Najít text: <item>(.*)<g:price>(.*)<\/g:price>(.*)<\/item>
Nahradit za text: <item><g:price>\g<2></g:price>\g<1>\g<3></item>
2) pravidlo, pořadí g:sale_price
Název: order - g:sale_price
Typ: Najít a narhadit
Najít text: <item>(.*)<g:sale_price>(.*)<\/g:sale_price>(.*)<\/item>
Nahradit za text: <item><g:sale_price>\g<2></g:sale_price>\g<1>\g<3></item>
3) Zpracování dat
Nyní jsme v situaci, kdy každý řádek začíná textem <item>...
a následujde buď g:sale_price pokud je uvedena, nebo g:price, pokud g:sale_price uvedena není. Cena je v obou elementech uvedena jako číslo, mezera a kód měny (např. CZK). Použijeme následující pravidlo:
Zpracování dat
Typ pravidla: Najít a nahradit
Najít text:<g:(sale_)?price>([^<]*) .*price>
Nahradit za text:<PRICE_VAT>\g<2></PRICE_VAT>
Toto pravidlo vezme číselnou hodnotu (pouze čísla bez písmen kódu měny) a zapíše je do elementu PRICE_VAT
. Výchozí elementy přitom odstraní. Pokud bude u položky item uvedena g:sale_price, zapíše do výstupní PRICE_VAT její hodnotu. Pokud :sale_price uvedena nebude, bude první číslo g:price a pravidlo zapíše tuto hodnotu.
Náhledy pravidel
Kdy se uvedený postup hodí
Blending Bull nebyl určen pro porovnávání hodnot a složitější operace s proměnnými. K tomu se hodí mnohem lépe MERGADO. Někdy však může být výhodou mít např. všechny operace s daty na jednom místě a Bulla bychom stejně použili. Nebo chce člověk použít pouze Blending Bull bez Mergada. V takových případech se uvedený postup může hodit.
Závěr
Uvedený postup ukazuje, že někdy lze pro zpracování dat využít postup využívající pořadí elementů, i když bychom jinak porovnávali např. velikost čísla v proměnné. Nebo podmínkou definovali zpracování jen pokud nějaký element obsahuje hodnotu. Toto nechť je pointou a inspirací pro řešení problémů, které potřebujete vyřešit vy