Tenhle fígl mne naučil @ludekvolejnik - mistr regulárních výrazů
Děkuji Luďo.
O co jde
Dosud jsem ukazoval, že v Blending Bullovi dokážete z textu vyparsovat proměnné. Ty pak dovedete zapsat do výstupního souboru. Viz. příklad, kde jsem zpracovával data z XML souboru do CSV pro import do Mergada. Regulárním výrazem v políčku Nalézt v datovém zdroji text jsem získával dvě proměnné.
Regulární výraz byl:
<item id="(.*?)"><stock_quantity>(.*?)<\/stock_quantity>.*<\/item>
Dále jsem do políčka Nahradit za text vložil:
"\g<1>","\g<2>"
Proměnné jsem označoval jako \g<X>
kde X bylo číslo pořadí.
Problém
Uvedený postup funguje spolehlivě, pokud jsou u všech items uvedeny obě proměnné. Narazil jsem ale na situaci, kdy to nebylo jisté. A @ludekvolejnik mi ukázal tento zápis:
Regulární výraz:
(?P<nazev>.*?)
Toto odpovídá zápisu (.*?)
ale má jednu zajímavou vlastnost. Do výstupu ho zapíšete jako:
\g<nazev>
tedy si můžete jednotlivé proměnné pojmenovat!
Což se může hodit. Zejména pokud nemáte jistotu, že např. druhá proměnná ze tří v item bude přítomna. Její absence by vám mohla zpracování feedu rozbít.
Příklad jak by vypadal celý zápis viz výše
Regulární výraz:
<item id="(?P<ID>.*?)"><stock_quantity>(?P<QUANTITY>.*?)<\/stock_quantity>.*<\/item>
Nahradit za text:
"\g<ID>","\g<QUANTITY>"
Řešení
Suma sumárum mi pojmenování proměnných přijde lepší než pořadí. Zápis vypadá krkolomně. Já si do záložek v prohlížeči uložím tuto stránku. A když ho budu potřebovat, zápis zkopíruji z tohoto příkladu
PS: @ludekvolejnik dělá školení regulárních výrazů. Pokud vás jejich síla oslovila (třeba proto, že vám šetří práci) doporučuji.