PPWizard - prßce s daty v externφch souborech
PPWizard umφ nejen vklßdat celΘ externφ soubory, Φi pouze jejich ·ryvky, ale takΘ umφ zpracovat soubory formßtu CSV a zvlßdß i komunikaci s databßzemi za vyu₧itφ jazyka SQL. Krom∞ toho umφ z jednoho vstupnφho souboru generovat vφce v²stupnφch soubor∙ v r∙zn²ch formßtech.
Vlo₧enφ externφho souboru
Z°ejm∞ nejjednoduÜÜφm a zaΦßteΦnφky nejhledan∞jÜφm p°φkazem bude vlo₧enφ externφho souboru. Je jφm p°φkaz #include
. Nejsnadn∞ji ho lze pou₧φt pro vlo₧enφ obsahu celΘho souboru:
#include "..\soubor.ih"
#include "..<?DirSlash>soubor.ih"
#include "c:\temp\soubor.ih"
#include "\\mojepc\temp\soubor.ih"
V prvnφm p°φpad∞, kdy zadßvßme pouze nßzev souboru, se tento soubor nejprve hledß v aktußlnφm adresß°i. Jestli₧e nalezen nenφ, hledß se v adresß°φch definovan²ch spouÜt∞cφ direktivou /INCLUDEPATH
. Pakli₧e ani zde PPWizard neusp∞je, hledß v adresß°φch definovan²ch v systΘmovΘ prom∞nnΘ PPWIZARD_INCLUDE
. Poslednφ prohledßvan² adresß° je ten, ve kterΘm je ulo₧en samotn² PPWizard.
Na druhΘm a t°etφm °ßdku se soubory hledajφ v adresß°φch o ·rove≥ vyÜÜφch ne₧ v p°edchozφm p°φpad∞, jinak je po°adφ stejnΘ. T°etφ °ßdek je shodn² s druh²m a₧ na drobn² rozdφl, dφky kterΘmu se stßvß nezßvisl²m na platform∞. Onφm drobn²m rozdφlem je standardnφ definice <?DirSlash>
, obsahujφcφ odd∞lovaΦ adresß°∙ pro dan² operaΦnφ systΘm.
╚tvrt² a pßt² °ßdek, myslφm si, nenφ t°eba vysv∞tlovat. Soubory jsou tady jednoznaΦn∞ urΦeny. Pokud neexistujφ, preprocesor p°i zpracovßvßnφ t∞chto p°φkaz∙ skonΦφ chybou.
Vlo₧enφ Φßsti externφho souboru
P°φkazem #include
nemusφme vklßdat v₧dy celΘ soubory, ale takΘ t°eba jen jejich Φßsti. T°etφm parametrem lze definovat °et∞zec, kter²m mß b²t po₧adovan² fragment souboru vymezen.
#include "soubor.html" "se:|<body>|</body>|"
Na prvnφm °ßdku hledß PPWizard v souboru soubor.html posloupnost znak∙ <!-- obsah -->. Jakmile ji nalezne, zaΦne obsah souboru vklßdat, dokud nenφ p°eruÜen op∞tovn²m uvedenφm stejnΘho °et∞zce.
Na druhΘm °ßdku nßzorn∞ vidφme, jak vymezit zaΦßtek a konec vklßdanΘho fragmentu jin²m °et∞zcem. ╪et∞zec zaΦneme se:, pokraΦujeme odd∞lovaΦem, °et∞zcem pro zaΦßtek fragmentu, dalÜφm odd∞lovaΦem, °et∞zcem pro konec fragmentu a poslednφm odd∞lovaΦem. Jako odd∞lovaΦ je mo₧nΘ pou₧φt jak²koli znak krom∞ pφsmena a Φφslice.
V °et∞zci nelze bohu₧el pou₧φt regulßrnφ v²raz. Kdyby to Ülo, p°φkazem #include
by se p∞kn∞ p°istupovalo k obsahu XML soubor∙. Mimochodem, funkce pro prßci s XML soubory bych vedle regulßrnφch v²raz∙ v PPWizardu opravdu ocenil.
Vlo₧enφ souboru na ·rovni projektu
V naÜem p°φkladu webu (viz prvnφ Φlßnek sΘrie) pou₧φvßme p°φkaz #include
pon∞kud zvlßÜtnφm zp∙sobem. PPWizard toti₧ nabφzφ k tomuto jedinΘmu p°φkazu ekvivalent pro p°φkazov² °ßdek. V souboru projektu project.ppw mßme zßpis /#include:macros.ih. Tφmto parametrem PPWizardu °φkßme, aby p°i zpracovßnφ vlo₧il na ·pln² zaΦßtek ka₧dΘho souboru obsah souboru macros.ih.
Prßce s CSV soubory a databßzemi
Nejmocn∞jÜφ p°φkazem pro prßci s externφmi daty je p°φkaz #import
. S nφm m∙₧ete p°istupovat k soubor∙m typu CSV a k SQL rozhranφm databßzφ. V naÜem ukßzkovΘm webu p°φkaz #import
v souboru imperdiet.it naΦφtß data ze souboru imperdiet.csv do HTML tabulky. Jak asi tuÜφte, CSV formßt je ideßlnφ pro cenφky a podobnß tabulkovß data. Export CSV formßtu umo₧≥uje v∞tÜina tabulkov²ch procesor∙.
V²tah ze souboru imperdiet.it:
#(
#import "imperdiet.csv" CMA "" "name" "num1" "num2"
#)
<table>
<tr>
<th>Name</th>
<th>Num1</th>
<th>Num2</th>
</tr>
#{ FOR @@Record = 1 to <?Data:TmpCsv.?>
#if @@Record // 2 = 0
#RexxVar class = "sr"
#else
#RexxVar class = "lr"
#endif
<tr class="<??class>">
<td><?Data:TmpCsv.@@Record.1></td>
<td class="num"><?Data:TmpCsv.@@Record.2></td>
<td class="num"><?Data:TmpCsv.@@Record.3></td>
</tr>
#}
</table>
Pro nßzornost zredukujme tento cel² k≤d na pouh² jeden °ßdek:
PPWizardu tφm °φkßme, ₧e soubor imperdiet.csv obsahuje na ka₧dΘm °ßdku t°i ·daje odd∞lenΘ Φßrkou. Na v²stup tento p°φkaz vypφÜe HTML tabulku s hlaviΦkou popisujφcφ prvnφ sloupec "name", druh² "num1" a t°etφ "num2". Nev²hodou je, ₧e se tabulka implicitn∞ naformßtuje ne v₧dy tφm nejvhodn∞jÜφm zp∙sobem. Toto implicitnφ nastavenφ m∙₧eme bu∩to p°ednastavit nebo m∙₧eme vyu₧φt cykl∙ a s v²stupem importu pracovat jako s datov²m polem.
Prßv∞ cykl∙ vyu₧φvßme pro p°izp∙sobenφ v²stupu. Pro pochopenφ ukßzky si vÜak musφme n∞co °φci o datov²ch polφch. Ta se definujφ p°φkazem #data
. Definujme si t°φsloupcovΘ pole "mojedata":
"a1" "a2" "a3"
"b1" "b2 "b3"
#data
Pole je ulo₧eno ve standardnφ definici <?Data:mojedata>
. Pro vypsßnφ prvnφho °ßdku a t°etφho sloupce bychom pou₧ili zßpis <?Data:mojedata.1.3>. PoΦet °ßdk∙ se skr²vß pod <?Data:mojedata.?>. Podrobnosti o datov²ch polφch najdete v oficißlnφ dokumentaci u popisu funkce #data.
Datovß pole u₧ tedy znßme a proto zp∞t k p°φkladu. Zm∞°me se nynφ na tuto konstrukci:
#(
#import "imperdiet.csv" CMA "" "name" "num1" "num2"
#)
Tento, na prvnφm °ßdku tochu zvlßÜtnφ, zßpis, p°evßdφ soubor imperdiet.csv do datovΘho pole "TmpCvs". To je nynφ k dispozici ve standardnφ definici <?Data:TmpSvc>. (Definice <?Data:TmpSvc.?> pak obsahuje poΦet °ßdk∙ a <?Data:TmpSvc.x.y> ypsilont² prvek na ikstΘm °ßdku.)
K tomuto datovΘmu poli p°istupujeme ve druhΘ Φßsti konstrukce za vyu₧φtφ opakovßnφ. Opakovßnφ zaΦφnß na °ßdku #{ a konΦφ na #}. S ka₧d²m cyklem vypφÜeme jeden °ßdek tabulky a zv²Üφme hodnotu REXX prom∞nnΘ "@@Record" o jedna. Tato prom∞nnß nßm tak v jednotliv²ch cyklech odkazuje na zßznam, jeho₧ hodnoty vypisujeme. Navφc rozliÜujeme lich² °ßdek od sudΘho.
PokroΦilΘ mo₧nosti p°φkazu #import
Zßkladnφ syntaxe p°φkazu #import
je nßsledujφcφ:
- File2Import - jmΘno CSV souboru
- ImportType - typ importovan²ch dat. V p°φkladu jsme pou₧ili CMA, v n∞m₧ se k odd∞lovßnφ ·daj∙ pou₧φvß Φßrka. DalÜφmi mo₧nosti jsou nap°φklad:
- TAB - ·daje odd∞lenΘ tabulßtorem
- SQL - p°φm² p°φstup k databßzi skrze SQL rozhranφ
- ML - ·daje jsou odd∞leny koncem °ßdku a polo₧ky prßzdn²m °ßdkem
- ??? - pou₧itφ libovolnΘho odd∞lovaΦe, v tomto p°φpad∞ znaku "?"
- DefineName - jmΘno konfiguraΦnφ °ady importu. Implicitnφ hodnota (pokud nenφ uvedena) je "IMPORT".
- DalÜφ parametry jsou nßzvy polo₧ek jednotliv²ch zßznam∙. PovinnΘ jsou jen pro n∞kterΘ typy importovan²ch dat. Vypisujφ se do hlaviΦky tabulky, pokud je p°φm²m v²stupem p°φkazu
#import
.
Ve v²Φtu jsem nakousl konfiguraΦnφ °ady p°φkazu #import
. Podle typu vstupnφch dat mßme Ükßlu konfiguraΦnφch parametr∙, kter²mi si lze p°izp∙sobit vstup i v²stup. Tyto parametry se definujφ p°ed spuÜt∞nφm p°φkazu #import
p°φkazem #define
. Jejich jmΘno zaΦφnß v₧dy jmΘnem konfiguraΦnφ °ady (hodnota "DefineName" u p°φkazu #import
) importu, pokraΦuje znakem "_" (podtr₧φtko) a konΦφ samotn²m konfiguraΦnφm parametrem. Nap°φklad takto bychom zm∞nili implicitnφ nastavenφ vypisovanΘ tabulky:
Jde vlastn∞ o definici makra, jeho₧ jmΘno je ji₧ implicitn∞ v PPWizardu p°edurΦenΘ pro zkrocenφ v²stupu p°φkazu #import
. O tento typ makra jde i na °ßdku #define IMPORT_#DATA TmpCsv.
Kdybych m∞l podrobn∞ probrat p°φkaz #import
, pot°eboval bych na to daleko vφce mφsta ne₧ jeden Φlßnek a p°itom bych Φtenß°e zbyteΦn∞ zahltil podrobnostmi. Proto jsem se sna₧il nastφnit jen to nejpodstatn∞jÜφ a podat obecn² p°ehled o p°φkazu. Dßle vßs ji₧ odkß₧i do oficißlnφ dokumentace na popis funkce #import. Pokud chcete v PPWizardu pracovat s SQL databßzemi, pak vßs odkß₧i do oficißlnφ dokumentace na strßnky Accessing SQL DATABASES Directly a #import - SQL.
V²stup do jinΘho souboru
Poslednφm p°φkazem, na kter² se v tomto Φlßnku podφvßme, je p°φkaz #output
, se kter²m lze p°esm∞rovat v²stup do jinΘho souboru. P°φklad:
Soubor test.txt
#output
...
#output "test.txt" Append
Druh² °ßdek souboru test.txt
#output "test2.txt"
Soubor test2.txt
#output
T°etφ °ßdek souboru test.txt
#output
Na prvnφm °ßdku p°esm∞rujeme v²stup ze standardnφho souboru na soubor test.txt. Pokud soubor existuje, bude jeho obsah p°epsßn. Na t°etφm °ßdku, tedy p°φkazem #output
bez parametru, vrßtφme v²stup do p∙vodnφho souboru. Na ΦtvrtΘm °ßdku op∞t p°epneme v²stup do souboru test.txt. P°φkazem Append
zajistφme, aby byl p∙vodnφ soubor zachovßn a text byl p°ipojen na jeho konec. V²stupem do souboru test2.txt demonstrujeme, ₧e lze p°φkaz #output
neomezen∞ vno°ovat.