Pb de ligne dans fichier txt
Résolu
nickleus
-
Posotaz Messages postés 489 Date d'inscription Statut Membre Dernière intervention -
Posotaz Messages postés 489 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Pb de ligne dans fichier txt
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
7 réponses
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 ?
--
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 ?
--
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)
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)
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.
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 :-)
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 :-)
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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). ;-)
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). ;-)
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.
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.
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 :-)
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 :-)