Čtení a načítání souboru CSV do pole v jazyce PHP

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 s...

Poptat web

02. 10. 2025

Čtení a načítání souboru CSV do pole v jazyce PHP

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,email
1,John Doe,john@example.com
2,Jane Smith,jane@example.com
3,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 immediately
while (($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:

<?php
function 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;
}
 
// Usage
print_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() s str_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í).

Původní článek publikoval Nabil Hassen.