🐮 Jak z g:price a g:sale_price vybrat jednu výstupní cenu

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 :cow: Jak zarovnat XML feed do “tabulky”.

2) Stanovit pořadí elementů g:price a g:sale_price

Viz návod :cow: 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:

:exclamation: 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 :thinking:

1 Like