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.

Il y a 11 commentaires.

Peter 9 août 2012
Merci Bon petit article bien pratique
Geeko 9 août 2012
Et dire que je m'embêtais avec un code long comme le bras pour gérer les flux CSV entre web et ERP, je sens que ça va beaucoup m'aider. Merci pour l'article !
Greg 4 déc. 2012
Nickel comme tuto, merci! Juste une petite erreur de frappe au point 1., dans la ligne : $csv->setFlags(SplFlieObject::READ_CSV); C'est bien "SplFileObject" et pas "SplFlieObject" ;-)
Ulrich 4 déc. 2012

Merci, c'est corrigé.

Lara 15 déc. 2012
Je veux moi ouvrir un fichier excel en Php svp pouvez vous m'aide Presse Marocaine
Ulrich 15 déc. 2012

Bonjour,

Il n'y a pas de support natif des fichiers Excel en PHP. Il vous faut utiliser une librairie comme l'excellente PHPExcel: http://phpexcel.codeplex.com.

Timothée 7 juin 2013
Hello, merci pour l'article. Une question tout de même, je ne trouve pas d'info sur comment inclure et donc utiliser cette classe.. une petite info? Merci Timothée
Ulrich 8 juin 2013

Bonjour, il n'est pas nécessaire d'utiliser include() ou require() pour les classes de la SPL, elles sont chargées automatiquement.

madvic 12 sept. 2013

Non de non !!! Et personne avant ne nous en avait parlé....pfffff

thierry 10 oct. 2013

Bonjour, Tout d'abord merci pour ce petit tuto. J'ai exécuté tel quel le code pour créer un csv, et mon fichier ne contenait que array;array;array;array. Normal, le tableau contient bien 4 tableaux ! Il faut boucler sur le array comme ceci :

 
foreach ($personnes as $lines) { 
    $csv->fputcsv($lines, ';'); 
} 

Bien pratique, encore merci.

Chris 4 avr. 2014
Vous venez de sauver un étudiant qui en perdait ses cheveux! Merci! Et une petite question, dans le cadre d'un petit site avec une petite interface d'administration, stocker les textes et informations du site dans des fichiers csv est une bonne idée? Sinon que me conseilleriez vous? je préfère éviter les bases de données vus le peu de données à stocker c'est comme prendre une citerne pour stocker un bidon d'essence :)

L'ajout de commentaire est temporairement désactivé à cause du spam.

Recherche

Détails de l'article