Jak načíst soubor CSV do pole v jazyce PHP
Soubory CSV (Comma-Separated Values) jsou jedním z nejběžnějších způsobů výměny dat mezi aplikacemi. Jsou lehké, čitelné pro člověka a snadno se s nimi pracuje v jazyce PHP. Ať už importujete data z aplikace Excel, zpracováváte hromadné odesílání dat nebo vytváříte nástroj pro vytváření zpráv, znalost toho, jak je načtení souboru CSV do pole v PHP je nezbytnou dovedností.
V této příručce se budeme zabývat různými přístupy k načtení souboru CSV do pole v PHP pomocí vestavěných funkcí a vlastní logiky. Na konci kurzu budete jasně vědět, kdy použít jednotlivé metody a jak řešit reálné situace, jako jsou záhlaví, oddělovače a velké soubory.
Co je soubor CSV?
Soubor CSV uchovává tabulková data v prostém textu. Každý řádek představuje záznam a sloupce jsou odděleny oddělovačem (obvykle čárkou, ale někdy i středníkem nebo tabulátorem).
Příklad data.csv:
id,name,email1,John Doe,john@example.com2,Jane Smith,jane@example.com3,Bob Lee,bob@example.com
Naším cílem je přečíst tento soubor v jazyce PHP a převést jej na pole pro snadné zpracování.
Metoda 1: Použití fgetcsv() (Klasický přístup)
Na stránkách nejběžnější způsob čtení souboru CSV do pole v PHP je s vestavěným fgetcsv() funkce. Tato funkce čte jeden řádek souboru najednou a automaticky jej analyzuje do pole.
<?php$csvFile = fopen("data.csv", "r");$data = []; while (($row = fgetcsv($csvFile)) !== false) { $data[] = $row;} fclose($csvFile); print_r($data);
Výstup:
Array( [0] => Array ( [0] => id [1] => name [2] => email ) [1] => Array ( [0] => 1 [1] => John Doe [2] => john@example.com ) [2] => Array ( [0] => 2 [1] => Jane Smith [2] => jane@example.com ) [3] => Array ( [0] => 3 [1] => Bob Lee [2] => bob@example.com ))
Tato metoda je šetrná k paměti, protože čte řádek po řádku. Je ideální pro velké soubory CSV.
Metoda 2: Převod řádků na asociativní pole
Často nechcete, aby číselné klávesy ([0], [1], [2]). Místo toho chcete, aby hlavičky (id, name, email) jako klíče pole. Postup je následující:
<?php$csvFile = fopen("data.csv", "r"); // First row as headers$headers = fgetcsv($csvFile);$data = []; while (($row = fgetcsv($csvFile)) !== false) { $data[] = array_combine($headers, $row);} fclose($csvFile); print_r($data);
Výstup:
Array( [0] => Array ( [id] => 1 [name] => John Doe [email] => john@example.com ) [1] => Array ( [id] => 2 [name] => Jane Smith [email] => jane@example.com ) [2] => Array ( [id] => 3 [name] => Bob Lee [email] => bob@example.com ))
S tímto formátem se mnohem lépe pracuje při přístupu k datům podle názvů sloupců.
Metoda 3: Použití file() s str_getcsv()
Další způsob, jak PHP načte soubor CSV do pole kombinuje file() s str_getcsv(). Ten přečte celý soubor do pole řetězců a poté analyzuje jednotlivé řádky.
<?php$rows = array_map('str_getcsv', file('data.csv'));print_r($rows);
Tento přístup je velmi kompaktní, ale načítá celý soubor do paměti najednou. Funguje skvěle pro malé až středně velké soubory CSV, ale měl by se vyhnout velmi velkým souborům dat.
Metoda 4: Obsluha vlastních oddělovačů
Ne všechny soubory CSV používají čárky. Někdy se používají středníky (;), karty (\t), nebo dokonce potrubí (|).
Můžete říct. fgetcsv() jaký oddělovač očekávat:
<?php$csvFile = fopen("data_semicolon.csv", "r");$data = []; while (($row = fgetcsv($csvFile, 1000, ";")) !== false) { $data[] = $row;} fclose($csvFile); print_r($data);
Tato flexibilita umožňuje fgetcsv() velmi silný.
Metoda 5: Vynechávání prázdných řádků a ořezávání dat
Soubory CSV jsou v reálném světě často nepřehledné. Můžete najít prázdné řádky, mezery navíc nebo neúplné řádky. Zde je návod, jak s nimi zacházet:
<?php$csvFile = fopen("data.csv", "r");$data = []; while (($row = fgetcsv($csvFile)) !== false) { // Skip empty lines if (count($row) == 1 && $row[0] === null) { continue; } // Trim spaces $row = array_map('trim', $row); $data[] = $row;} fclose($csvFile);
Metoda 6: Efektivní čtení velkých souborů CSV
Při práci s obrovskými soubory (stovky MB) může načtení všeho najednou do pole vyčerpat paměť. Místo toho zpracovávejte řádky při jejich čtení:
<?php$csvFile = fopen("bigfile.csv", "r"); // Process each row immediatelywhile (($row = fgetcsv($csvFile)) !== false) { // For example, insert into a database // insertIntoDatabase($row);} fclose($csvFile);
Tímto způsobem nikdy neuchováváte celou sadu dat v paměti.
Bonus: Převod CSV na funkci vícerozměrného pole
Zde je opakovaně použitelná funkce načtení souboru CSV do pole v PHP s možnostmi pro záhlaví a oddělovače:
<?phpfunction csvToArray($filename, $delimiter = ",", $hasHeader = true) { if (!file_exists($filename) || !is_readable($filename)) { return false; } $data = []; if (($handle = fopen($filename, "r")) !== false) { $headers = $hasHeader ? fgetcsv($handle, 1000, $delimiter) : []; while (($row = fgetcsv($handle, 1000, $delimiter)) !== false) { if ($hasHeader) { $data[] = array_combine($headers, $row); } else { $data[] = $row; } } fclose($handle); } return $data;} // Usageprint_r(csvToArray("data.csv"));
Závěr
Čtení souboru CSV do pole v jazyce PHP je jednoduché, ale správný přístup závisí na případu použití:
- Použijte
fgetcsv()pro většinu scénářů (čtení po řádcích). - Použijte
array_combine()pokud chcete asociativní pole se záhlavími. - Použijte
file()sstr_getcsv()pro malé soubory, když chcete mít stručný kód. - Pro velmi velké soubory použijte streamování (zpracování řádků tak, jak přicházejí).