Afficher avant-dernière ligne fichier txt [Résolu/Fermé]

Signaler
-
 alcor91 -
Bonjour,

J dernière ligne qui m'intéresse. Je précise que je ne peux pas la xième ligne par exemple car le fichier gagne un ligne par jour.
Merci d'avance pour votre aide. e bloque depuis un moment sur le problème suivant :
Voilà, en php, je cherche à afficher l'avant dernière ligne d'un fichier txt distant que je ne peux donc pas modifier de mon propre chef. Je ne peux pas afficher la dernière ligne car celle est blanche. Je dois donc trouver le moyen d'afficher l'avant


9 réponses

Bonjour,

essaie avec ce code

<?php
$ligne="";
$monfichier = fopen('monfichier', 'r+');
while (!feof($monfichier)) {
$ligneprec=$ligne;
$ligne = fgets($monfichier);
}
fclose($monfichier);
echo $ligneprec;
?>
Bonjour Maître Yoda !

Merci !
Ca fonctionne parfaitement sur un fichier local. Par contre, comme je l'avais mentionné dans ma question, je souhaite travailler sur un fichier texte distant ex: http://www.site.com/monfichiertexte.txt . Apparemment, la fonction fopen('monfichier', 'r+'); pose problème. J'ai essayé avec @file() mais pas de résultat.
Si, ça fonctionne si le serveur le permet. A distance il n'y a que le mode "r" (lecture seule) qui marche, le mode "r+" étant le mode lecture/écriture.

fais un test avec
$monfichier = fopen("http://www.site.com/monfichiertexte.txt ", "r");
Ca ne fonctionne toujours pas, hélas ni avec "r" ni avec "r+", ma ligne apparaît blanche. Je pense que le problème pourrait être résolu avec un script qui permettrait d'envoyer, une fois par jour, le fichier dans le ftp de mon site, puisque ta première version fonctionnait avec un fichier local. Hélas, je ne suis pas assez calé pour savoir faire ça.
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
121
Pourrais tu donner l'adresse du fichier en question, stp ?
Je voudrais voir ce que je peux faire
oui, la voici :
http://www.swpc.noaa.gov/ftpdir/latest/DSD.txt
Avec ce fichier test, ça marche bien chez moi. J'ai PHP 5.3.13

<?php
$ligne="";
$monfichier = fopen("http://www.swpc.noaa.gov/ftpdir/latest/DSD.txt", "r");
while (!feof($monfichier)) {
$ligneprec=$ligne;
$ligne = fgets($monfichier);
//echo $ligne;
}
fclose($monfichier);
echo $ligneprec;
?>
Chez moi, page blanche, j'ai php 5.1.3, site hébergé chez Free. Ceci vient-il de cela ?
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
121
Merci

J'ai fait tourner ce programme en Python:

import httplib 

hypr = httplib.HTTPConnection(host='www.swpc.noaa.gov') 
hypr.request('GET','/ftpdir/latest/DSD.txt') 
content = hypr.getresponse().read() 

print repr(content[-100:])


[-100:] c'est pour ne prendre que les 100 derniers caractères de la chaîne

La fonction repr() , c'est pour afficher tous les bytes explicitement, c'est à dire sans que les bytes codant pour l'affichage soient interprétés


J'ai obtenu ceci:

'1   0  0  0  3  0  0  0\n2012 05 22  121     95      780      1    -999   B3.0   0  0  0  3  0  0  0\n'



Le dernier byte est '\n'. C'est le byte qui fait aller à la ligne, autrement dit LF dans un affichage par Notepad++.
Donc quand on affiche le contenu du fichier, on obtient un affichage dans lequel, juste après "B3.0 0 0 0 3 0 0 0" il n'y a pas la fin du texte seulement, mais un retour à la ligne suivante. Mais quand on dit "ligne" dans la phrase précédente, c'est une ligne à l'affichage, c'est l'effet visuel à l'écran. Donc on voit un espace libre, qu'on décrit comme une ligne vide. Mais cette apparence n'est qu'un effet visuel, et toi tu ne veux pas capter un effet visuel, tu veux capter une chaîne de caractères/bytes

Si par contre on appelle ligne toute séquence de bytes dans un fichier qui se termine par '\n' ou la fin du fichier, alors la dernière ligne dans le code source du fichier est bien
"2012 05 22 121 95 780 1 -999 B3.0 0 0 0 3 0 0 0\n"

Tu crois donc que la dernière ligne est blanche, mais en fait la dernière ligne du fichier telle que je l'ai définie, est pleine de caractères et se termine par le byte '\n'

En Python, pour attraper cette ligne , je fais simplement (parce que le fichier n'est pas énorme):

import httplib 

hypr = httplib.HTTPConnection(host='www.swpc.noaa.gov') 
hypr.request('GET','/ftpdir/latest/DSD.txt') 
content = hypr.getresponse().read() 

print content.splitlines(True)[-1]


content est la chaîne du code source du fichier capté à distance
content.splitlines(True) splite cette chaîne en une liste de lignes. L'argument True indique à la méthode splitlines() qu'il faut garder les LF = '\n' dans les élements (= lignes) de la liste obtenue
Et [-1] sélectionne le dernier élément càd la dernière ligne de la liste= du fichier


Tu peux peut être trouver des compréhensions supplémentaires dans ma bafouille ici:
https://forums.commentcamarche.net/forum/affich-25182883-inserer-une-ligne-dans-un-fichier-texte#18


NB: 25 minutes pour faire tout ça, codes et ce post

Vive PHP !
Merci Heyquem,

Mais en php, ça donne quoi finalement ? Parce que moi et le Python, ça fait 3 !
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
121
J'ai envie de te répondre que ce n'est pas mon problème si tu utilises un mauvais langage, si tu ne sais pas dépasser tout seul ses insuffisances et si la communauté de PHP est formée de développeurs médiocres, en tous cas ici, au point que 24 heures après ta question, tu n'aies toujours pas de solution en PHP
Bien que je ne souhaite pas spécialement être désagréable.
Mais parfois il faut que les choses soient dites clairement pour qu'elles soient comprises.
Libre à toi de continuer avec PHP, je souligne seulement qu'avec Python, je résouds ton problème en moins de 10 minutes. Et j'ai apporté quelques explications, te sont elles utiles ?
Ben c'est pas sympa pour les développeurs en PHP. La bonne réponse a bien été donnée par Yoda, par exemple et celle-ci semble fonctionner chez lui. La question qui demeure est : pourquoi ça ne fonctionne pas chez moi.
Pour revenir à la question, tout mon site est développé depuis 7 ans en PHP avec mes piètres connaissances. Je ne me vois pas apprendre un nouveau langage juste pour faire apparaître une info sur celui-ci.
Tes explications m'ont éclairé sur la manière dont le fichier txt était conçu, mais ça ne résout pas mon problème.
Merci pour ton aide
Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
881
<?php
$chemin_fichier='repertoire/fichier.txt'; //ici le chemin relatif vers ton fichier par rapport à ce script php
if(is_file($chemin_fichier)){
	//on verifie que le fichier peut bien etre atteint avec le chemin defini ci dessus
	//lecture contenu
	$array_fichier=file($chemin_fichier); //met le contenu dans un array ligne par ligne
	$nombre de lignes=sizeof($array_fichier);
	if($nombre de lignes>0){
		//affichage avant derniere ligne
		//l'array est numeroté à partir de ZERO donc
		$n_adl=$nombre de lignes-2;
		echo 'Avant derniere ligne: '.$array_fichier[$n_adl];
	}else{
		echo 'Fichier vide !';
	}
}else{
	echo 'fichier inaccessible ou inexistant, verifier le chemin !';
}
?>


au passage merci heyquem on voit qu'il existe encore des gens qui se croient supérieurs !!!
Bonjour,

Donc, je confirme, le problème vient de l'hébergeur "FREE" avec lequel certaines fonctions comme file() ou fopen() ne fonctionne plus.
J'ai essayé via un autre hébergeur et ça fonctionne. Hélas, cette solution ne m'intéresse pas.