Aujourd'hui, je fouillais pour trouver un moyen simple de traiter un fichier CSV en PHP. Mon idée était d'inviter le visiteur à télécharger son fichier par un formulaire, à choisir quelques options et à importer le contenu dans une base de données en cliquant sur un bouton. En cherchant une base solide pour manipuler ce type de structure, j'ai découvert l'objet built-in SplFileObject de la SPL (Standard PHP Library).
Oui, j'aurais certainement pu ouvrir le fichier de façon standard, le lire ligne par ligne, exclure celles vides, séparer les enregistrements avec split(), etc. Mais à quoi bon si SplFileObject le fait pour moi ? En plus, comme c'est une classe spécialisée pour solutionner ce type de pattern, on peut l'utiliser tel quel ou hériter notre objet de celui-ci.
Pour faire ça simple, prenons un fichier CSV séparé par tabulations :
echantillon.csv
a1 a2 a3 a4 a5Lecture du fichier
b1 b2 b3 b4 b5
c1 c2 c3 c4 c5
$fo = new SplFileObject('files/echantillon.csv');Notez ici que le caractère de tabulation doit être inscrit entre guillemets pour que ça fonctionne. Ensuite, définissez les flags d'options :
# définition du caractère séparateur de colonnes
$fo->setCsvControl("\t");
$options = SplFileObject::READ_CSV + SplFileObject::DROP_NEW_LINE + SplFileObject::SKIP_EMPTY;Utilisé seul, SplFileObject::READ_CSV lira toutes les lignes mais les transformera en array indexé (selon le caractère séparateur spécifié) pour manipuler les données plus facilement. S'il y a des lignes vides (comme la 3ème), elles seront incluses dans le tableau.
Pour les exclure, on additionnera la combinaison des flags SplFileObject::DROP_NEW_LINE et SplFileObject::SKIP_EMPTY.
$fo->setFlags($options);Enfin, on lira le fichier ligne par ligne :
foreach( $fo as $line ){Avec ce simple bout de code, ça devient facile d'imaginer un formulaire plus flexible qui comprend :
# attention, le offset pourrait être vide!
# on s'assure qu'il y a bien 5 colonnes
if( count($line) == 5 ){
list($col1, $col2, $col3, $col4, $col5) = $line;
# utiliser les variables
# ...
}
else{
echo 'Ligne incomplète';
}
# sinon, on y accède par l'index
# echo $line[0];
}
- input file pour fournir le fichier
- choix du caractère séparateur (select box)
- radio button pour indiquer si le fichier comprend le nom des colonnes en entête
Bonjour,
merci pour l'article, c'est super clair !
Par contre, je n'arrive pas à lui faire parcourir tout le fichier quand j'utilise DROP_NEW_LINE et/ou SKIP_EMPTY. Et quand je les enlève, j'ai un problème au moment du retour à la ligne : la dernière cellule de la ligne n et la première cellule de la ligne n+1 ne sont pas dissociées puisqu'il n'y a pas de séparateur (tabulation) entre les deux !
Pouvez-vous m'éclairer ?
Merci d'avance