V některých případech nemůžeme uložit tabulková data do databáze a použítí XML není příliš efektivní. Jedná se hlavně o různé jednoduché seznamy např. pracovníků, poboček, distributorů, telefonů apod. Problém řeší uchování dat ve formátu CSV. Ten je totiž schopen vytvořit i obyčejný Excel, takže vytvoření souboru s daty je více než jednoduché.

Hned na začátek ale uvádím jednu vyjímku oproti formátu CSV, kterou je odstranění možnosti použít znak ; v obsahu buněk. Ten totiž nebude ohraničen středníkem, jak tomu je v těchto případech. Funkce celého parseru by pak byla velmi složitá.

Načtení celého CSV souboru do dvojrozměrného pole je velmi jednoduché. Využijeme přitom funkci file(), která obsah souboru načte do pole, kde jeden řádek bude reprezentován jedním záznamem. Jednotlivé záznamy (řádky) pak rozdělíme do dalších polí podle středníků. Načtené hodnoty pak zobrazíme jako tabulku.

<?php
// načtení dat do pole
$pole = file(‚data.csv‘);
for($i=0;$i<Count($pole);$i++) {
$pole[$i] = explode(‚;‘, $radky[$i]);
}
// vykreslení tabulky
echo(‚<table>‘);
for($i=0;$i<Count($pole);$i++) {
echo(‚<tr>‘);
for($j=0;$j<Count($pole[$i]);$j++) {
echo(‚<td>‘ . $pole[$i][$j] . ‚</td>‘);
}
echo(‚</tr>‘);
}
echo(‚</table>‘);
?>

Kdyby bylo naším cílem jen vykreslení tabulky, mohli bychom tuto operaci provést rovnou, bez ukládání do proměnné. Uvedené řešení ale umožní upravit data jednoduše před výsledným zobrazením, nebo další prací (např. barevně odlišit buňky, dosadit doplňující data, obrázky, nebo provést různé matematické operace).

CSVEdit

Jak už jsme si řekli, vytvoření CSV souboru s daty a následná práce s ním je vcelku jednoduchá. Problém ale nastává tehdy, chceme-li existující data upravit (minimálně nějaká pravopisná chyba se vloudí snad vždycky). Excel sice umí vytvořit CSV soubor, ale sám ho nedokáže po sobě přečíst, protože za oddělovač buněk považuje čárky (nikoli středníky). Pokud CSV soubor znovu otevřeme, zobrazí se nepoužitelná směsice dat. Řešení tohoto problému je několik. První představuje nutnost vždy soubor uložit nejprve ve formátu .xls, potom v .csv a při každé další operaci nejprve otevřít soubor xls, změnit data, uložit nový xls soubor a provést export. Takové řešení je pro případ drobných změn příliš složité.

Řešení druhé je důmyslně napsaný PHP skript, který jsem nazval CSVEdit. Ten zobrazí celý soubor do formuláře, kde můžeme jednoduše provést úpravu údajů, která se po odeslání formuláře projeví i v samotném souboru. Tato verze neumožňuje změnu počtu řádků či buňek v tabulce, nicméně to už je záležitost, která se dá řešit pro každý případ zvlášť. Oproti řešení s dalším .xls souborem zde může PHP skript bežet přímo na serveru v ostré verzi, takže se změny projeví okamžitě. Díky jednoduchosti uživatelského rozhraní můžete editaci dat svěřit i méně zkušenému uživateli.

Princip skriptu je podobný, jako u čtení souboru, které jsme si vysvětlili na začátku článku. Jen se celá operace několikrát opakuje.

<?php

První část skriptu se stará o zapsání informací do souboru, pokud již byl odeslán formulář s novými daty. Pokud tomu tak je, bude nastavena skrytá hodnota formuláře $odeslano na ano.

if($odeslano == ‚ano‘) {
for($i=0;$i<Count($data);$i++) {
$data[$i] = implode(‚;‘, $data[$i]);
}
$soubor = fopen(‚data.csv‘, ‚w‘);
for($i=0;$i<Count($data);$i++) {
fwrite($soubor, $data[$i] . ‚
‚);
}
fclose($soubor);
}

Tato operace se liší od běžného čtení jen v tom, že jako zdroj slouží dvojrozměrné pole s daty a cílem je CSV soubor.

Nyní přichází na řadu zobrazení formuláře. Tento proces je zcela nezávislý na předchozí operaci, ale je dobré ho provádět až po zápisu, aby se změny v datech projevily hned při příštím načtení CSVEditu. Samotné zobrazení je svým principem shodné se čtením dat, jen se místo ukládání do pole vypisují jako hodnoty formulářových prvků. Zde je použit další malý trik, který přidáním hranatých závorek za název proměnné umožňuje odeslat skriptu pole dat. Název textového pole se tvoří podle šablony data[řádek][sloupec].

echo(‚<form method=“post“>‘);
$radky = file(‚data.csv‘);
for($i=0;$i<Count($radky);$i++) {
$radek = explode(‚;‘, $radky[$i]);
echo(‚<nobr>‘);
for($j=0;$j<Count($radek);$j++) {
echo(‚<input type=“text“ name=“data[‚ . $i . ‚][‚ . $j . ‚]“ value=“‚ . $radek[$j] . ‚“ />‘);
}
echo(‚</nobr>‘);
echo(‚<br/>‘);
}
echo(‚<input type=“hidden“ name=“odeslano“ value=“ano“ /><input type=“submit“ />‘);
echo(‚</form>‘);

?>

Celý skript si můžete stáhnout.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

1 Příspěvěk v diskuzi

  1. Dobrý den,

    můžete mi prosím pomoct s velikostí buněk ve web. prohlížeci (nevejde se mi tam delší text)?

    a v případě, že tam něco přepíšu, tak se mi změny neuloží.

    děkuji moc

Odpovědět