Lire un fichier CSV (Excel) avec PHP

Publié dans PHP | Marqué avec , ,
Share

Je viens de découvrir 2 petites fonctions PHP bien utiles pour s’occuper d’un fichier Excel. (ou équivalent) Si vous avez déjà essayé de traiter un fichier Excel avec PHP, vous savez sûrement qu’il faut préalablement enregistrer ce fichier au format CSV (Comma-Separated Values), vos colonnes sont alors séparées par des points virgules ( ; ) et vos lignes par un retour à la ligne. Donc un fichier CSV ressemble à ceci :
case1;case2;"case 3 avec des espaces";case4
case5;case6;"case 7 avec des espaces";case8

A partir de la, au premier abord, on s’apprête à utiliser des regex (preg_match_all par exemple) pour lire le fichier, mais ce serait perdre un peu de temps pour pas grand chose. En effet, il existe 2 fonctions pour lire et écrire un fichier CSV en PHP : fgetcsv et fputcsv.

  • fgetcsv : lit un fichier CSV et renvoie le résultat de la ligne courante dans un tableau puis déplace le pointeur à la ligne suivante. Donc une petite boucle while($data = fgetcsv(...)) et on récupère toutes les lignes du fichier. Quants aux arguments à fournir : un pointeur vers un fichier ouvert (avec fopen par exemple), et si on veut : taille maximum de la ligne (1000 par exemple), le séparateur (la virgule par défaut), le caractère de délimitation (double quote par défaut), le caractère d’échappement (l’antislash par défaut)
  • fputcsv : écrit une ligne dans un fichier à partir d’un array, et déplace le pointeur à la ligne suivante. Quants aux arguments à fournir : un pointeur vers un fichier ouvert (avec fopen par exemple), un tableau avec le contenu à insérer, et si on veut : le séparateur (la virgule par défaut), le caractère de délimitation (double quote par défaut), le caractère d’échappement (l’antislash par défaut)

Un petit exemple pour bien comprendre :

$fd1 = fopen('tmp.csv', 'w');
$fd2 = fopen('res.csv', 'w');
while (($data = fgetcsv($fd1, 1000, ';')) !== FALSE) {
   $data[0] $data[0]+3;
   fputcsv($fd2, $data, ';');
}
fclose($fd1);
fclose($fd2); 

Ici je lis un fichier tmp.csv, je modifie sa première colonne en lui ajoutant 3 et j’écris la ligne modifiée dans un nouveau fichier res.csv.
Si vous lisez plusieurs fois le même fichier à la suite, au lieu de le fermer puis de la ré-ouvrir à chaque fois, vous pouvez utiliser rewind($fd) pour repositionner le pointeur au début du fichier.

Autre chose qui peut être pratique. str_getcsv fait exactement la même chose que fgetcsv, sauf qu’il ne prend pas en argument un fichier mais une chaine de caractères ! Donc si vous avez besoin de créer un array rapidement…

Une réponse à Lire un fichier CSV (Excel) avec PHP

  1. Ben

    Ton article a l’air intéressant mais il est malheureusement illisible. Dommage

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*