Lire et écrire facilement des fichiers CSV avec la SPL de PHP5
Importer ou exporter des données au format CSV est un grand classique pour une application métier ou un back office. Peu connu, la Standard PHP Library (SPL) permet de manipuler facilement les fichiers avec la classe SplFileObject. Cette classe dispose de fonctions spécifiques pour manipuler en lecture et écriture les fichiers au format CSV. Il est donc facile d'écrire du code style POO et d'abandonner le code procédurale old school pour ce genre de tache.
1. Lire un fichier CSV
La lecture est simple, il suffit de passer le chemin du fichier au constructeur et le mode d'ouverture (ici 'r') puis de spécifier à la classe que l'on veut un support CSV.
$csv = new SplFileObject('upload_dir/file1.csv', 'r'); $csv->setFlags(SplFileObject::READ_CSV);
La classe SplFileObject implémente l'interface Iterator de la SPL, il suffit d'une boucle foreach pour récupérer les lignes une à une. Chaque ligne sera sous la forme d'un tableau représentant les colonnes du fichier CSV.
foreach($csv as $ligne) { echo 'valeur de la 1ere colonne: '.$ligne[0]; }
Il est possible de configurer la lecture du fichier CSV: le caractère de séparation, d'encadrement ou d'échappement. Voici la configuration pour un fichier CSV généré avec MS Excel.
$csv->setCsvControl(';', '"', '"');
Code complet pour la lecture d'un fichier CSV provenant d'Excel:
$csv = new SplFileObject('upload_dir/file1.csv', 'r'); $csv->setFlags(SplFileObject::READ_CSV); $csv->setCsvControl(';', '"', '"'); foreach($csv as $ligne) { echo 'valeur de la 1ere colonne: '.$ligne[0]; }
2. Ecrire un fichier
La création et l'écriture d'un fichier CSV est quasiment aussi simple que la lecture. Notez le mode d'ouverture qui diffère.
$csv = new SplFileObject('upload_dir/file2.csv', 'w');
a. Avant PHP 5.4
Si vous utilisez PHP 5.2 ou 5.3 il faut formater les données avant de les écrire dans le fichier.
$personnes = array(array('nom', 'prenom', 'age'), array('Martin', 'Jean', '33'), array('Dupont', 'Guillaume', '28'), array('Dronz', 'Jay', '29')); $csv = new SplFileObject('upload_dir/file2.csv', 'w'); foreach ($personnes as $personne) { $line = '"'; $line .= implode('";"', $personne); $line .= '"'; $line .= "\r\n"; $csv->fwrite($line); }
b. Après PHP 5.4
Nouveauté de la version 5.4 de PHP, l'apparition de la méthode fputcsv() qui permet de convertir un tableau PHP au format CSV et de l'écrire dans le fichier. Chaque valeur du tableau sera considérée comme une ligne dans le fichier CSV. Il est également possible de setter le séparateur et autres options.
$personnes = array(array('nom', 'prenom', 'age'), array('Martin', 'Jean', '33'), array('Dupont', 'Guillaume', '28'), array('Dronz', 'Jay', '29')); $csv = new SplFileObject('upload_dir/file2.csv', 'w'); $csv->fputcsv($personnes, ';');
Comme vous avez pu le remarquer, à aucun moment je ne tente de fermer la ressource comme on le fait avec fclose(). Cette tâche est gérée en interne. Cerise sur le gâteau, toutes les erreurs lié à la manipulation des fichiers est émise par des Exceptions ce qui rend le développement orienté objet encore plus simple.
Réponse de Ulrich le 8 juin 2013