Anglická verze
logolink

< Zpět na seznam lekcí

Práce s textovým souborem v PHP

PHPObsah lekce:

  • Požití textového souboru jako komponenty dynamického webu
  • Zdrojový soubor s daty
  • Formát CSV
  • Práce s textovým souborem v PHP

Požití textového souboru jako komponenty dynamického webu

Jednou z částí dynamického webu může být stránka obsahující informace uložené v rámci textového souboru v adresářové strukutře webu. Může se jednat o jednoduchý soubor s informacemi, které je jednodušší uložit do souboru namísto databáze (nebo nemáme databázový server k dispozici - například v rámci nějakého webhostingu, který je zdarma a databázovou technologii zkrátka nelze využívat).

V našem příkladu na zpracování textového souboru budeme uvažovat seznam zaměstnanců uložený v textovém souboru a ten budeme ze souboru vizualizovat jako html stránku.

Zdrojový soubor s daty

Vstupním souborem našeho skriptu bude soubor v tabulkovém kalkulátoru Microsoft Excel obsahující tabulku zaměstnanců. Soubor je k dispozici v jedné z následujících variant:

Vzhledem k tomu, že zdrojový soubor v tabulkovém kalkulátoru je binární (obsahuje standardně nečitelná data - zkuste si prohlédnout jeden ze stažených souborů nějakým obyčejným textovým editorem např. poznámkový blok nebo pspad apod.), tak je třeba obsah tohoto souboru uložit tak, aby byl pro nás a náš skript čitelný.

V našem příkladu exportujeme seznam zaměstanců do textového souboru ze seznamu vytvořeného v tabulkovém procesoru typu Excel. K tomuto účelu použijeme formát CSV (v tabulkovém procesoru zvolíme uložit jako formát CSV). Uložením do formátu CSV dojde k tomu, že vznikne textový soubor se stejnými textovými daty jako v tabulkovém procesoru. Každému řádku v tabulce tabulkového procesoru odpovídá v textovém souboru je jeden řádek s tím, že údaje z jednotlivých sloupců jsou v textovém souboru odděleny středníkem (zpravidla).

uložení do formátu csv

Textový soubor bude na každém řádku obsahovat všechny informace o jednom člověku (kontaktu).

CSV soubor bude po zobrazení textovým editorem vypadat takto:

CSV soubor s daty
Zaměstnanci GJŠ Zlín;;;;;;
;;;;;;
Jméno ;Příjmení;Titul;E-mail;Telefon;Fotografie;Zkratka
Eliška;Babíková;;babikova@gjszlin.cz;577007450;babikova.jpg;
Radim;Bárta;Mgr.;barta@gjszlin.cz;577007448;barta.jpg;Bár
Libuše;Beranová;Ing.;beranova@gjszlin.cz;577007434;beranova.jpg;Ber
Milan;Buday;Mgr.;;;;
Oldřiška;Burešová;Mgr.;buresova@gjszlin.cz;577007436;buresova.jpg;Bur
...

Pomineme-li první tři řádky, pak vidíme, že každý řádek obsahuje informace o jednom konktrétním zaměstnanci ve tvaru Jméno;Příjmení;Titul;E-mail;Telefon;Fotografie;Zkratka. Je tedy možné soubor jednoduše zpracovat, neboť jsou v něm všechny hodnoty jednoduše čitelné.

O formátu CSV

Podívejme se přesněji na to, jak soubor ve formátu CSV vypadá. Jedná se o jednoduchý souborový formát určený pro výměnu tabulkových dat (například mezi různými systémy). Takovýto soubor se skládá z řádků, ve kterých jsou jednotlivé sloupce v rámci jednoho řádku odděleny oddělovacím znakem (nejčastěji to bývá čárka nebo středník) - toto je také význam CSV neboli "Comma-separated values". Jednotlivé položky řádku (sloupce) mohou být uzavřeny do uvozovek (například proto, že text v rámci sloupce může obsahovat oddělovací znak - například středník - a je tedy nutno takový řetězec uzavřít do uvozovek, aby bylo zřejmé, že se nejedná o oddělovač sloupců, ale o znak ve sloupci obsažený).

Popis formátu CSV

V tomto formátu (CSV) jsou uloženy pouze text a hodnoty a to tak, jak jsou zobrazeny v buňkách aktivního listu. Všechny řádky i všechny znaky v každé buňce budou uloženy. Sloupce dat budou odděleny středníky a každý řádek dat bude zakončen znakem konce řádku. Jestliže buňka obsahuje středník, bude obsah buňky ohraničen uvozovkami.

Pokud jsou v buňkách zobrazeny vzorce místo hodnot vzorců, budou vzorce převedeny jako text. Veškeré formátování, grafické objekty, objekty a jiný obsah listu budou ztraceny. Symbol eura bude převeden na otazník.

Poznámka: Pokud sešit obsahuje zvláštní znaky písma, například symbol autorských práv (©), a budete používat převedený textový soubor v počítači s jiným operačním systémem, uložte tento sešit v příslušném textovém formátu daného systému. Jestliže například používáte systém Windows a chcete použít textový soubor v počítači Macintosh, uložte soubor ve formátu CSV (Macintosh). Používáte-li počítač Macintosh a chcete použít textový soubor v systému Windows nebo Windows NT, uložte soubor ve formátu CSV (Windows).

Zdroj: Microsoft Online Help v aplikaci Microsoft Excel 2007

Uvědomme si, že převodem z tabulky v tabulkovém procesoru, která obsahuje jiné písmo, barvy apod. o tyto informace v textovém souboru přijdeme a zůstanou pouze textová data. Na tento fakt nás tabulkový procesor při ukládání upozorní.

upozornění excelu na rizika uložení do csv

Pro výměnu dat se již dnes používá spíše formát xml, ale práce s ním je o něco složitější a pro naši potřebu formát CSV postačí.

Práce s textovým souborem v PHP

Vytvoříme složku a v ní vytvoříme testovací soubor zobraz-soubor.php se skriptem pro načtení souboru a do vnořené složky se jménem data uložíme náš CSV soubor pod jménem zamestnanci.csv.

uložení souborů

Nyní se dostáváme k problematice samotného skriptu, který by měl soubor otevřít a vypsat nám jeho obsah do prohlížeče. V první řadě vložíme do našeho souboru základní kostru html dokumentu.

Základní kostra HTML dokumentu

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Seznam zaměstnanců</title>
</head>
<body>

</body>
</html>

Náš skript bude fungovat tak, že otevře soubor v daném umístění, projde ho řádek po řádku a aktuální řádek vždy vypíše do html. V krocích bychom si to mohli představit jako následující postup:

  • Pokus se otevřít soubor zamestnanci.csv pro čtení.
  • Pokud se to nepovede, tak napiš chybové hlášení a jinak:
  • Vezmi jeden řádek souboru, ulož jej do proměnné a dokud nebude konec souboru, tak proměnnou vypiš a pokračuj stejně na dalším řádku.

Otevření souboru v PHP

K otevření souboru slouží v PHP funkce fopen (popis). Tato funkce má celkem dva povinné parametry:

  • umístění souboru - to je v našem případě relativní cesta data/zamestnanci.csv
  • režim otevření souboru - zde specifikujeme, co hodláme se souborem dělat - v jakém režimu jej chceme otevřít (zda jen pro čtení, pro zápis, pro obojí apod.). V našem případě jej chceme pouze číst a tak jej otevřeme v režimu pro čtení (parametr "r").
Použití funkce fopen
$soubor=fopen("data/zamestnanci.txt", "r");

Test na existenci zadaného souboru v PHP

Na ověření existence požadovaného otevíraného souboru v PHP slouží funkce file_exists (popis). Tato funkce vrací hodnotu TRUE pokud zadaná cesta existuje a FALSE v opačném případě. Tato funkce má jeden povinný parametr:

  • umístění souboru - to je v našem případě relativní cesta data/zamestnanci.csv
Použití funkce file_exists
$filename = '/path/to/foo.txt';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}

Test na konec souboru v PHP

Na ověření zda se nacházíme na konci souboru v PHP slouží funkce feof (popis). Tato funkce vrací hodnotu TRUE pokud je ukazatel v souboru na konci souboru a FALSE v opačném případě. Tato funkce má jeden povinný parametr:

  • ukazatel na soubor - to je v našem případě ukazatel na náš cílový soubor

Po úspěšném otevření souboru získáme ukazatel $soubor na nás soubor a cyklus while obstará proces procházení souboru řádek po řádku dokud není konec souboru. Jinak řečeno: "Dokud nám funkce feof nevrátí true (tzn. je konec souboru), pak pokračujeme ve čtení souboru řádek po řádku.".

Použití funkce feof
while (!feof($soubor)){
//zpracování jednoho řádku souboru
}

Přečtení jednoho řádku ze souboru v PHP

Na přečtení jednoho řádku ze souboru v PHP slouží funkce fgets (popis). Tato funkce vrací řetězec o délce delka-1 (delka je volitelný parametr). Tato funkce má jeden povinný a jeden volitelný parametr:

  • ukazatel na soubor - to je v našem případě ukazatel na náš cílový soubor
  • délka - počet znaků, který se nejvýše z daného řádku přečte
Použití funkce fgets na přečtení řádků souboru o max. délce 5000 znaků
while (!feof($soubor)){
$radek = fgets($soubor,5000);
}

Výsledná podoba skriptu na přepis souboru do prohlížeče

Výsledný skript vložíme mezi značky <?php a ?> do těla stránky mezi tagy <body></body>. Skript se pokudí otevřít soubor a provádí čtení souboru řádek po řádku a výpis jednotlivých řádků do prohlížeče.

Použití funkce fgets na přečtení řádků souboru o max. délce 5000 znaků
          $nazev_souboru="data/zamestnanci.csv";
          if (file_exists($nazev_souboru)) {
                $soubor=fopen($nazev_souboru, "r");
                if($soubor){
                    while (!feof($soubor)){
                        $radek = fgets($soubor,5000);
                        print($radek);
                        print("<br />");
                    }
                } 
                else 
                {
                    print("Soubor ".$nazev_souboru." se nepodařilo otevřít pro čtení.");
                }
           } 
           else 
           {
           print("Soubor ".$nazev_souboru." neexistuje.");
           }
        

Výsledný výpis souboru v prohlížeči by měl vypadat takto:

zobrazeni obsahu souboru v prohlížeči

Další čtení

Odkazy

Otázky

  1. Je nějakým způsobem možné exportovat data z tabulkového procesoru v textové podobě?
  2. Jaké nevýhody může přinést převod tabulky z tabulkového procesoru do textového formátu?
  3. Charakterizujte formát CSV.
  4. Jaké základní funkce pro čtení textového souboru v PHP znáte?
webdesign, xhtml, css, php - Mgr. Michal Mikláš