Pb de ligne dans fichier txt

Résolu/Fermé
nickleus - 19 janv. 2008 à 16:14
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 - 21 janv. 2008 à 21:47
Bonjour,

Explication :
je creer un nouveau fichier txt à chaque execution d'un script ou le nombre de ligne peux varier suivant le nombre de resultat recupéré avant.

MAIS

sur la toute dernière ligne, il n'y a rien mise a part un espace.

Exemple :

1. VAR1 VAR2
2. VAR1 VAR2
3. VAR1 VAR2
4. <---------- c'est la dernière ligne ou il y a juste un espace.

Et je ne veux pas que cette ligne existe car dans un autre script, je compte le nombre de ligne et ça fausse le resultat puisqu'il devrait compter 3 lignes au lieu de 4, alors je suis obliger de bricoler en fesant : count($ligne)-1.

comment puis je eviter d'avoir cette ligne vide.

voici le script qui creer le fichier txt :

if($fileImport=fopen($dirExtract.$namefile, "w")){

for($res=0; $res<=$compte; $res++){
$filleul=$IDf[$res];
$parrain=$IDp[$res];
$writeTxt=$filleul." ".$parrain;
if($res!=0)
{fputs($fileImport, "\r\n");}
fputs($fileImport, $writeTxt);}
fclose($fileImport);}}
else
{echo "Il n'y a pas de nouveaux inscrits";}

je suis ouvert a toutes les solutions

merci d'avance
A voir également:

7 réponses

Gihef Messages postés 5150 Date d'inscription mercredi 20 juillet 2005 Statut Contributeur Dernière intervention 20 février 2023 2 775
19 janv. 2008 à 21:04
Bonjour,

Je ne connais rien à PHP (c'est bien du PHP ?), mais je me demande… Juste au cas où.

Les “resultat recupéré avant” sont récupérés où ?
Dans un fichier qui se termine par une ligne vide ?

--
0
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
20 janv. 2008 à 05:36
Hello,


En plus de la bonne suggestion de Gihef, je pense (juste par expérience) que la condition de ta fin de boucle doit être "$res<$compte" au lieu de "<=" puisque tu commences à compter à partir de 0 et que si le compte est 1, il faut qu'il s'arrête après le premier tour alors que là il va continuer un deuxième tour vu que 1=1 rend la condition toujours vraie...

Alors je pense que comme le PHP est un langage qui n'oblige pas à déclarer les variables, quand tu vas demander un indice de tableau qui n'existe pas il va te renvoyer du vide, donc écrire "\r\n" (retour de chariot et saut de ligne) et puis "vide" + espace (que tui mets entre filleul et parrain) + "vide".

Voilà selon moi d'où vient le problème mais je peux me tromper puisque je ne sais pas ce que représente "compte" mais si ça représente ce que ça signifie (un nombre d'entrées qui correspond au nombre de lignes que tu dois écrire) ça doit provenir de ce problème de sortie de boucle tardive.

(parlant de tardif quelqu'un peu me dire ce que je fais encore debout à cette heure-ci ? :D)
0
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
20 janv. 2008 à 05:49
Ah, je sais ce que je fais encore debout... juste pour te dire que quand même ce n'est pas une solution très élégante de faire comme tu fais. En général on écrit autant de fois la valeur suivie d'une nouvelle ligne autant de fois qu'on a des éléments-1

et ensuite on écrit le dernier à part (si on en a au moins 1, donc il faut faire le test) sans le fire suivre d'une nouvelle ligne. Tu y gagneras en performances et ce sera plus élégant.

$res=0;
for(; $res<$compte-1; $res++) { //je veux m'arrêter à l'avant dernier
  écrire valeur de position $res;
  écrire nouvelle ligne
}

// si on a écrit quelque chose c'est l'avant dernier.
// si on n'avait qu'un seul élément il ne sera pas écrit encore puisqu'on lui a demandé de s'arrêter à "nombre d'éléments - 1" (1-1=0 et que 0<1-1 est faux).

if($compte > 0) { // on vérifie quand même qu'on avait au moins un élément à écrire
  écrire valeur de position $res; // si c'est 0 ben on écrit le seul de la liste (le premier), si c'est plus grand on écrira le dernier
}

Si je "hais" le PHP c'est parce qu'il est trop permissif (tout comme le JavaScript). Dans un autre langage de programmation tu aurais eu une belle erreur de "index out bounds exception ; index : 4, size 4" (les valeurs permises étant de 0 à 3 puisqu'ona urait été obligés de fixer la taille du tableau avant de l'utiliser).

Enfin je m'emballe mais tiens-nous quand même au courant :-)
0
je vous remercie de votre aide mais en faite j'avais trouvé la solution bien avant 6 h du mat' (je ne suis pas aissi leve top le dimanche).

j'ai fait différament pour avoir une solution me convenent et ça fonctionne tres bien. Je sais pas si la solution va être pertinante.

enfin voila :

if($fileImport=fopen($dirExtract.$namefile, "w")){

for($res=0; $res<=$compte; $res++){
$filleul=$IDf[$res];
$parrain=$IDp[$res];
$writeTxt=$filleul.$parrain;
if($res!=0)
{if($res<$compte){
fputs($fileImport, "\r\n");}
fputs($fileImport, $writeTxt);}
fclose($fileImport);}

Pour Gihef les variable exporte d'une db.

merci a tous
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
20 janv. 2008 à 18:11
Salut :-)

Heu... tu ne perds pas systématiquement la première ligne en faisant comme ça ? Et fermer le fichier dès de premier tour par la même occasion ? En indentant ton code ça donne ça et c'est assez choquant :
 for($res=0; $res<=$compte; $res++){
	$filleul=$IDf[$res];
	$parrain=$IDp[$res];
	$writeTxt=$filleul.$parrain;
	if($res!=0) {
		if($res<$compte) {
			fputs($fileImport, "\r\n");
		}
		fputs($fileImport, $writeTxt); // Il ne va pas passer ici au premier tour puisque $res==0 (donc il ne va rien écrire)
	}
	fclose($fileImport); // Ici tu fermes le fichier dès le premier tour de boucle ?
} 	


Pour le premier tour (où $res vaut 0) tu lui demandes de tester si $res est différent de 0 (il ne l'est pas) donc il ne va pas entrer dans la condition et il va passer directement à l'instruction fclose... là y'a un problème parce qu'au deuxième tour où il va essayer d'écrire dans le fichier (qui sera fermé) il va râler.

Soit tu as mal recopié le code sur le forum, soit il ne fonctionne pas... mais prends toujours la solution suggérée plus haut (la façon élégante de faire). ;-)
0
nickleus Messages postés 374 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 18 juin 2011 5
20 janv. 2008 à 19:15
je test si $res!=0 parce que je ne veux justement pas avoir de passage a la ligne au premier passage de la boucle.
voila le code fini et je confirme il marche mais il est dans un autre code donc peut etre qu'il n'est pas au plus juste mais j'ai fait au meiux

if($fileImport=fopen($dirExtract.$namefile, "w")){

for($res=0; $res<=$compte; $res++){
$filleul=$IDf[$res];
$parrain=$IDp[$res];
$writeTxt=$filleul.$parrain;
if($res!=0)
{if($res<$compte){
fputs($fileImport, "\r\n");}}
fputs($fileImport, $writeTxt);}
fclose($fileImport);}

voila ca devrai etre bon.
0
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
21 janv. 2008 à 21:47
Hello,

En effet il manquait deux "}" fatidiques qui faisaient que le code précédent ne pouvait pas fonctionner, là ça va mieux.

Si tu insistes vraiment pour ne pas oper pour une solution plus élégante de faire tu peux tout de même (simple suggestion) simplifier

if($res!=0) { if($res<$compte){...

en

if($res!=0 && $res<$compte) {...

puisque tu as toujours besoin que les deux conditions soient vraies.

Enfin, content que le problème soit résolu :-)
0