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

  • Peter08-09-2012 10:41:40

    Merci
    Bon petit article bien pratique

  • Geeko08-09-2012 11:37:11

    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 !

  • Greg12-04-2012 08:36:24

    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" ;-)

  • Ulrich12-04-2012 10:01:35


    Merci, c'est corrigé.


  • Lara12-15-2012 12:48:20

    Je veux moi ouvrir un fichier excel en Php svp pouvez vous m'aide
    Presse Marocaine

  • Ulrich12-15-2012 13:46:30


    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ée06-07-2013 14:47:24

    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

  • Ulrich06-08-2013 14:39:58


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


  • madvic09-12-2013 12:01:23


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


  • thierry10-10-2013 10:30:54

    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.

  • Chris04-04-2014 00:01:29

    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 :)