Lecture et traitement d’un fichier
Lecture rapide et intégrale d'un fichier avec PHP
La partie précédente nous a permis d'aborder la notion de gestion de fichier en PHP. On a appris à ouvrir et à fermer un fichier, et surtout à écrire dans le fichier. Maintenant, faisons l'inverse. Imaginons un fichier, et que l'on veuille récupérer son contenu pour le traiter ensuite. PHP propose encore une multitude de fonctions pour gérer tout ça.
Plusieurs fonctions permettent de lire tout un fichier en une passe, parmi lesquelles on distingue la fonction file_get_contents().
Son utilisation est assez simple puisqu'il suffit de lui passer en paramètre l'adresse du fichier pour qu'elle retourne une chaîne de caractère avec l'intégralité du contenu.
//lecture intégrale d'un fichier $contenu=file_get_contents("fichier.txt"); echo $contenu; ?>
Une autre fonction s'appelle readfile(). Elle est identique à la fonction file_get_contents() sauf qu'elle retourne le contenu du fichier vers la sortie standard et retourne le nombre d'octets lus. On utilise donc la fonction readfile() dans le cas où l'on ne veut pas avoir le fichier dans une chaîne.
//lecture intégrale d'un fichier if(readfile("fichier.txt"))// si le fichier a été lu correctement, affichage du contenu sur le navigateur { echo " nombre d'octect :".readfile("monfichier.txt"); //affichage du nombre d'octets } else // sinon { echo "aucun affichage"; } fclose($fic) ; ?>
Il existe de plus une fonction similaire à readfile() mais qui nécessite l'ouverture de fichier avec fopen. Il s'agit de la fonction fpassthru(). Elle prend comme unique argument le descripteur de fichier retourné par fopen() à l'ouverture.
La fonction file() offre une troisième possibilité afin de lire le fichier en intégrale. Cette fonction est aussi identique à readfile, sauf qu'au lieu de renvoyer le contenu du fichier vers la sortie standard, elle le transforme en un tableau. La syntaxe pour récupérer le contenu est donc celle-ci :
$tableau=file($fic);
Lire un fichier caractère par caractère : fgetc
La lecture d'un fichier peut également consister à prendre son contenu caractère par caractère, au moyen de la fonction fgetc().
//lecture d'un fichier caractère par caractère $fic=fopen("fichier.txt", "r"); while(!feof($fic)) { $caractere=fgetc($fic); if(!feof($fic)) { echo $caractere . " "; } } fclose($fic) ; ?>
Ce code lit un caractère à la fois dans un fichier et l'affiche. Vous remarquerez une nouvelle fonction dans la boucle. Il s'agit de feof() dont le terme est l'abréviation de " File End Of File " (traduite par "fichier : fin de fichier"). Cette fonction prend en paramètre un pointeur de fichier et retourne true si le pointeur est positionné à la fin du fichier.
La boucle continue donc tant que ce n'est pas la fin du fichier. Pour que ça soit plus visible, on a mis chaque caractère sur une ligne lors de l'affichage.
Lire un fichier ligne par ligne : fgets
Il est aussi intéressant de récupérer chaque ligne du fichier. La fonction employée est fgets(). Elle retourne tous les caractères jusqu'à la prochaine fin de ligne. Cependant, une telle lecture peut s'avérer lourde si l'on manipule des chaine de caractère de grande taille.
On peut donc spécifier une taille en octets comme deuxième paramètre. Ainsi, la fonction retourne au maximum ce nombre de caractère même si aucune fin de ligne n'a été détectée. Habituellement, on spécifie une taille arbitraire de 1024 octets pour lire toute la ligne.
//lecture d'un fichier ligne par ligne $fic=fopen("fichier.txt", "r"); $i=1 ;//Compteur de ligne while(!feof($fic)) { $ligne= fgets($fic,1024); echo "ligne numéro ".$i." : " . $ligne . " "; $i ++; } fclose($fic) ; ?>
Exploitation d'un fichier de tableur CSV
On n'a pas cessé d'apprendre des choses nouvelles sur la gestion des fichiers en PHP mais à quoi sert tout ça ?
Une des applications très courante de la manipulation de fichier est le traitement de fichier CSV. En effet, le format CSV ou Comma Separated Values constitue un vrai standard d'échange. On a par exemple un fichier CSV qui contient pas mal de données, et on souhaite accéder au contenu pour les manipuler comme des variables PHP.
La fonction fgetcsv() permet d'avoir une ligne d'un fichier CSV. Si vous n'avez pas encore un fichier CSV prêt à emploi, ouvrez votre tableur (Excel par exemple), et entrer les données sur chaque ligne. Ensuite, enregistrez sous format CSV.
Soit un fichier acteur.csv de cette forme :
Jakie;Chan;90 David;Caradine;34 Luciela ;Santos;89 Véronica ;Castro;67
On utilise la fonction fgetcsv comme suit :
$ligne = 1; // compteur de ligne $fic = fopen("acteurs.csv", "a+"); while($tab=fgetcsv($fic,1024,';')) { $champs = count($tab);//nombre de champ dans la ligne en question echo " Les " . $champs . " champs de la ligne " . $ligne . " sont : "; $ligne ++; //affichage de chaque champ de la ligne en question for($i=0; $i<$champs; $i ++) { echo $tab[$i] . " "; } } ?>
Compléments : autres fonctions pour la manipulation d'un fichier
A part tout ce que l'on a déjà vu ici, il y a encore d'autres fonctions utiles qui méritent d'être abordées dans ce tutoriel. Bien entendu on n'aura pas le temps de tout voir, mais on a essayé et on essayera d'aborder l'essentiel.
Vérification de l'existence d'un fichier : file_exists
La fonction file_exists() est intéressante puisqu'elle permet de déterminer si un fichier existe ou pas.
if (file_exists("fichier.txt")) { echo "Le fichier existe'"; } else { echo "Fichier inexistant"; } ?>
Taille d'un fichier : filesize
On peut savoir la taille d'un fichier grâce à la fonction filesize(). La taille retournée est mesurée en octets.
if (file_exists("fichier.txt")) { echo "La taille du fichier est de :" . filesize("fichier.txt")." octets"; } else { echo "Fichier inexistant"; } ?>
Suppression d'un fichier : unlink
Puisque c'est la fin des manipulations, profitons pour faire un peu le ménage :
La destruction des contenus d'un fichier est parfois nécessaire, or la fonction unlink() permet de supprimer un fichier. Si le fichier ne peut pas être supprimé, par absence d'autorisation par exemple, la fonction retourne false.
unlink("fichier.txt"); ?>
En faisant cela, vous remarquerez que le fichier.txt qu'on a utilisé tout au long du tutoriel n'apparait plus dans votre répertoire.
Attention à ne pas supprimer un fichier important, la fonction est irrémédiable ! En considérant tout ça comme étant acquis, passons maintenant à autre chose.