PPWizard - práce s daty v externích souborech
14. 08. 2004 | Jan Bien | Editory a IDE | Komentáře: 0
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 "..soubor.ih"
#include "..<?DirSlash>soubor.ih"
#include "c:tempsoubor.ih"
#include "\mojepctempsoubor.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" "<!-- obsah -->"
#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:
#define IMPORT_#DATA TmpCsv
#(
#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:
#import "imperdiet.csv" CMA "" "name" "num1" "num2"
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":
#data mojedata 3
"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:
#define IMPORT_#DATA TmpCsv
#(
#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í:
#import "File2Import" "ImportType" "DefineName" "FieldInfo1" ...
- 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:
#define IMPORT_TABLE_ATTRIBS border="0" cellspacing="0" cellpadding="0"
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:
#output "test.txt"
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.
Odkazy, zdroje
- #data - Dennis Bareis (PPWizard manual, 30. 7. 2004)
- #import - Dennis Bareis (PPWizard manual, 30. 7. 2004)
- #include - Dennis Bareis (PPWizard manual, 30. 7. 2004)
- #output - Dennis Bareis (PPWizard manual, 30. 7. 2004)
- /#include - Dennis Bareis (PPWizard manual, 30. 7. 2004)
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Další aktuální články na interval.cz
- Rychost, rychlost, rychlost - zrychlete své stránky
- Chamurappiho Webylon: čtyři články s kritikou W3C
- Nenápadný cloud: synchronizace dat z prohlížečů
- Pozvánka: Random Hacks of Kindness 2012
- Zajímavost o češtině pro redakční systém WordPress
Tematicky související články
- PPWizard - programování vlastních rexx kódů
- PPWizard - tvoříme a spravujeme WWW stránky
- PPWizard - pokročilá makra, podmínky a standardní definice
- Dreamweaver 3.0 - práce s tabulkami
- Dreamweaver 4 - vylepšená práce s tabulkami
Dejte vědět i ostatním o článku
Diskuse (počet komentářů: 0)
Buďte prvním návštěvníkem, který přidá nový komentář.
