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
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
A voir également:
- Pb de ligne dans fichier txt
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier iso - Guide
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 777
19 janv. 2008 à 21:04
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 ?
--
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 ?
--
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
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)
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)
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
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.
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
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
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 :
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). ;-)
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
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.
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.
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
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 :-)
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 :-)