Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

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.


Reklama


Další aktuální články na interval.cz

Tematicky související články

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ář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.