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.

Ecrit par Chris le 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 :)

Ecrit par thierry le 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.

Ecrit par madvic le 12 sept. 2013

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

Ecrit par Timothée le 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

Réponse de Ulrich le 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.

Ecrit par Lara le 15 déc. 2012

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

Réponse de Ulrich le 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.

Ecrit par Greg le 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" ;-)

Réponse de Ulrich le 4 déc. 2012

Merci, c'est corrigé.

Ecrit par Geeko le 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 !

Ecrit par Peter le 9 août 2012

Merci Bon petit article bien pratique

Ajouter un commentaire