Zpracování CSV

PHP, Tipy & triky

Pro zpracování CSV v PHP existují funkce již dlouho. Ty ale při trochu komplikovanějším řešení nemusí naplno dostačovat a je potřeba se podívat po nějaké té knihovně. Jako například CSV od PHP League.

Zpracování CSV

V PHP jsou funkce pro zpracování CSV. Jsou to fputcsv a freadcsv, které mohou při jednoduchém zpracování posloužit. Při složitějších úkonech ale je vhodné sáhnout po knihovně, která práci značně zjednoduší. Jedna taková je CSV od PHP League.

Největším problémem je značně rozlišné API mezi verzí 8 a 9. Ideální by samozřejmě bylo používat pouze verzi 9, ta je ale bohužel podporována až od PHP 7. Proto při použití ve starších projektech je nutné sáhnout ještě po verzi 8, která je podporována do února 2018.

Něco o CSV je popsáno ve starším článku Generování CSV v Unicode

Čtení, zápis, kódování, převody

Knihovna obsahuje pouze pár souborů o celkové velikosti pár desítek kB. Přesto nabízí obrovské množství možností. CSV dokáže načíst ze souboru i ze stringu, vkládat data lze postupně, hromadně či přímo importovat/exportovat data z/do databáze. Dokáže si poradit s převodem kódování, data exportovat jako JSON, XML či HTML tabulku. Data při procházení lze navíc filtrovat, seřadit, získat jeden sloupec či dvojice. 

Dokumentace může vypadat na první pohled složitě, protože možnosti jsou opravdu obrovské. Popis všech funkcí je ale doplněn příklady, takže samotné použití je přímočaré. Následující ukázka kódu obsahuje jednoduché použití této knihovny se znázorněnými rozdíly mezi verzí 8 a 9.

$reader = \League\Csv\Reader::createFromPath('test.csv');
$reader->setDelimiter(';');

// ###################### Načtení CSV ###########################
// Implicitní převod z kódování CP1250 (Excel) na UTF-8
// --- Verze 8 ( PHP5.5+ )
if ($reader->isActiveStreamFilter()) {
    $reader->appendStreamFilter('convert.iconv.CP1250/UTF-8');
}
// --- Verze 9 ( PHP7.0+ )
if ($reader->supportsStreamFilter()) {
    $reader->addStreamFilter('convert.iconv.CP1250/UTF-8');
}

// ################# Iterace přes všechny řádky #################
// Shodný přístup pro verzi 8 i 9
foreach ($reader as $index => $row) {
    echo "{$index}: ".print_r($row, true)."\n";
}

// ######### Iterace s pojmenovanými sloupci ze záhlaví #########
// Projde pouze 2 záznamy, záhlaví s názvem sloupců je na 0 řádku
// --- Verze 8 ( PHP5.5+ )
$result = $reader->setLimit(2)->fetchAssoc(0);
foreach ($result as $index => $row) {
    echo "{$index}: ".print_r($row, true)."\n";
}
// --- Verze 9 ( PHP7.0+ )
$reader->setHeaderOffset(0);
$stmt = (new \League\Csv\Statement())->limit(2);
$result = $stmt->process($reader);
foreach ($result as $index => $row) {
    echo "{$index}: ".print_r($row, true)."\n";
}

UTF-8/16/32 BOM

Stejně jako v předchozím článku o generování CSV pro Microsoft Excel v UTF-8, i CSV knihovna obsahuje funkce pro zpracování BOM sekvence. Kromě zápisu BOM jej dokáže na vstupním souboru také detekovat

The League of Extraordinary Packages

Balíček je vytvořen skupinou The League of Extraordinary Packages, která tvoří balíčky pro PHP "správně". Jejich mantrou jsou standardy PHP-FIG a PHP The Right Way. Rozhodně i další balíčky a knihovny z jejich produkce stojí za shlédnutí.


Vaše zkušenosti s CSV v PHP či přímo touto knihovnou můžete sdílet s ostatními v komentářích

K tomuto článku již není možné přidávat další komentáře