Travailler avec CSV en PHP : guide complet
CSV (Comma-Separated Values) est l'un des formats les plus populaires pour l'échange de données tabulaires. PHP dispose à la fois de fonctions intégrées pour travailler avec CSV et de puissantes bibliothèques tierces. Dans cet article, nous allons passer en revue toutes les principales méthodes de lecture, d'écriture et de traitement des fichiers CSV en PHP.
Fonctions PHP intégrées pour travailler avec CSV
PHP fournit plusieurs fonctions intégrées qui permettent de travailler avec des fichiers CSV sans installer de bibliothèques supplémentaires. Les principales sont :
fgetcsv()— lecture d'une ligne depuis un fichier et son analyse en tableaufputcsv()— écriture d'un tableau dans un fichier au format CSVstr_getcsv()— analyse d'une chaîne CSV en tableau
Lecture d'un fichier CSV avec fgetcsv
La fonction fgetcsv() lit une ligne d'un fichier ouvert et la retourne sous forme de tableau. Exemple de lecture d'un fichier entier :
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { while (($data = fgetcsv($handle, 1000, ',')) !== false) { // $data — tableau contenant les données de la ligne echo implode(' | ', $data) . ""; } fclose($handle);}?>Paramètres de la fonction fgetcsv() :
handle— descripteur de fichierlength— longueur maximale de la ligne (généralement 0 ou 1000)separator— séparateur de champs (par défaut la virgule)enclosure— caractère d'encadrement des champs (par défaut le guillemet double)escape— caractère d'échappement (par défaut l'antislash)
Écrire des données dans un fichier CSV
Pour l'écriture, on utilise la fonction fputcsv(). Elle prend un tableau et le convertit en chaîne CSV :
<?php$data = [ ['Nom', 'Âge', 'Ville'], ['Ivan', 25, 'Moscou'], ['Maria', 30, 'Saint-Pétersbourg'],];
$filename = 'output.csv';$handle = fopen($filename, 'w');
foreach ($data as $row) { fputcsv($handle, $row, ';', '"');}
fclose($handle);echo "Le fichier $filename a été créé avec succès !";?>Dans cet exemple, nous utilisons le point-virgule (;) comme séparateur, ce qui est courant dans les fichiers CSV russophones.
Traitement de gros fichiers CSV
Lorsqu'on travaille avec de gros fichiers (des centaines de milliers de lignes), il est important de ne pas charger tout le fichier en mémoire. Utilisez la lecture ligne par ligne :
<?phpfunction processLargeCSV($filename) { $handle = fopen($filename, 'r'); // On saute l'en-tête s'il existe $header = fgetcsv($handle); while (($row = fgetcsv($handle)) !== false) { // On traite chaque ligne $processed = array_map('trim', $row); // Votre logique de traitement peut être ici yield $processed; // Utilisation d'un générateur } fclose($handle);}
// Utilisationforeach (processLargeCSV('bigdata.csv') as $row) { // On travaille avec chaque ligne individuellement echo "Ligne traitée : " . implode(',', $row) . "";}?>L'utilisation de générateurs (yield) permet de traiter des fichiers de n'importe quelle taille sans dépassement de mémoire.
Bibliothèque League\\Csv pour un travail avancé
Pour des tâches plus complexes, il est recommandé d'utiliser la bibliothèque league/csv. Elle offre une interface orientée objet pratique et de nombreuses fonctionnalités supplémentaires.
Installation via Composer :
composer require league/csvExemple d'utilisation :
<?phprequire 'vendor/autoload.php';
use League\\Csv\\Reader;use League\\Csv\\Writer;
// Lecture CSV$csv = Reader::createFromPath('data.csv', 'r');$csv->setHeaderOffset(0); // Première ligne — en-tête
// Obtention de tous les enregistrements sous forme de tableau associatif