Nápad č. 12
Počítadlo
Řekněme, že jsem XML soubor s informacemi o zboží převedl v Bullovi pravidlem na “tabulku” tak, že na každém řádku je jedna položka zboží. Položky zboží obsahují označení výrobce. Např. <brand>Nike</brand>
pro zboží značky “Nike”. Já bych potřeboval počítadlo. Toto počítadlo bude sledovat hodnoty v proměnné. Když najde hodnotu poprvé, zapíše do počítadla “1”. Když už hodnotu zná, navýší stav počítadla vždy o 1. Hodnotu počítadla může zapsat do souboru pomocí systémové proměnné.
Příklad vstupních dat:
<item><name>Tenisky A</name><brand>Nike</brand></item>
<item><name>Tenisky B</name><brand>Nike</brand></item>
<item><name>Tenisky C</name><brand>Adidas</brand></item>
<item><name>Tenisky D</name><brand>Botas</brand></item>
<item><name>Tenisky E</name><brand>Nike</brand></item>
Nyní zapnu počítadlo. jako proměnnou stanovím <brand>(.*)</brand>
. Odtud budu čerpat hodnoty proměnné. Výstup zapíši do: <brand>\g<1></brand><counter>%BB_COUNT%</couter>
[1]. Tedy do elemnu brand
zapíši původní nalezenou hodnotu \g<1>
. A za něj zapíši element counter
do kterého zapíši proměnnou s hodnotou počítadla. Pro tento příklad jsem ji pojmenoval BB_COUNT
. Pojmenování je pracovní. Jmenovat se může jinak. Výstup by pak vypadal takto:
<item><name>Tenisky A</name><brand>Nike</brand><counter>1</counter></item>
<item><name>Tenisky B</name><brand>Nike</brand><counter>2</counter></item>
<item><name>Tenisky C</name><brand>Adidas</brand><counter>1</counter></item>
<item><name>Tenisky D</name><brand>Botas</brand><counter>1</counter></item>
<item><name>Tenisky E</name><brand>Nike</brand><counter>3</counter></item>
Celkem by přitom počítadlo našlo proměnné:
Hodnota proměnné | Počet |
---|---|
Nike | 3 |
Adidas | 1 |
Botas | 1 |
Z příkladu je vidět, že u nalezených výskytů obsahu proměnné, se hodnota počítadla postupně navyšuje. Tak jak pravidlo prochází data. Pokud bych ze vstupního příkladu vyfiltroval pouze řádky, kde proměnná \g<1>
nabývá hodnoty Nike
, vypadaly by tyto řádky po zpracování pravidlem s počítadlem následovně:
<item><name>Tenisky A</name><brand>Nike</brand><counter>1</counter></item>
<item><name>Tenisky B</name><brand>Nike</brand><counter>2</counter></item>
<item><name>Tenisky E</name><brand>Nike</brand><counter>3</counter></item>
Zde je vidě, že hodnota počítadla postupně roste: 1 - 2- 3…
K čemu je to dobré
Jiné aplikace zpracování dat paralelizují. Je tedy komplikované v práci zohlednit vztahy mezi shopitems. Např. zda je zboží daného názvu v nabídce unikátní, zda se název zboží opakuje (má varianty, kolik těch variant je atp.) atp. Bull pracuje lineárně. Toho bychom mohli využít a práci s vícenásobnými výskyty zavést.
Řešení
Nastíním laicky. Mohlo by jít o speciální typ pravidla. Něco jako “Najít a nahradit s počítadlem”. Nebo by se počítadlo volitelně mohlo zapnout u stávajícího pravidla Najít a nahradit. Pravidlo by v textu hledalo text který splní zadání uživatele a z něj vyparsuje proměnnou. Novinkou by byl “dočasný zásobník”. Do něj by pravidlo nalezené hodnoty “házelo”. Vždy zkontrolovalo zda tam hodnota už je. Pokud není, zapíše nově. Pokud je, číslo počítadla navýší o jedničku. Po ukončení práce pravidla by se zásobník vyprázdnil. Hodnota počítadla pro danou proměnnou by byla uživateli přístupná v (nějaké) systémové proměnné. Podobně jako např. datum.
Řešení v UI
Viz výše, napadají mne dvě možnosti:
- Nový typ pravidla “Najít a nahradit s počítadlem”. To by se chovalo stejně jako pravidlo Najít a nahradit. Navíc by první proměnnou v regulárním výrazu zpracovalo jako viz výše.
- Možnost zapnout počítadlo jako “doplněk” stávajícího pravidla Najít a nahradit. V UI by mohlo jít o checkbox pod stávajícím checkboxem Zpracovat jako regulární výraz. Oři zapnutí by Bull musel zkontrolovat, zda je zapnuté zpracování regulárním výrazem. Bez něj by počítadlo nemělo kde číst data.
- ANO, tahle funkce by se mi hodila
- nápad jsem četl, ale nepotřebuji ho
Syntaxi zápisu proměnné jsem převzal z proměnné datum. ↩︎