PPWizard – práce s daty v externích souborech

14. srpna 2004

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.

Předchozí článek radek-bruna.cz
Další článek tdp-zachrana-dat.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *