Page 1 sur 1

fgets -> ligne en double

Posté : 18 avr. 2011, 10:26
par yeste64
Bonjour à tous. J'ai un problème lors de la lecture d'un fichier : Il le lit correctement, j'en extrait les données que je veux et tout et tout, mais seulement, il me lit 2 fois la dernière ligne ...
Voici mon code :
$fichier = fopen($cheminFichierUploade, 'r'); //Ouverture en lecture seule du fichier de contacts de base

if ($fichier) //Si on a réussi à l'ouvrir
{
	while (!feof($fichier)){ //On lit le fichier ligne par ligne
		$ligneCourante = fgets($fichier);
		$ligneCourante = strtr($ligneCourante, '<>', '  '); //On remplace les < et > par des espaces
		$decoupeLigne = explode("\t", $ligneCourante);
		for($i=1; isset($decoupeLigne[$i]); $i++){ //On parcours le contenu de chaque colonne de la ligne
		
			// On récupère le contenu des colonnes choisies par l'utilisateur
			if ($i == $colonneContact){
				$contenuNomContact = $decoupeLigne[$i];
			}
			if ($i == $colonneCodePostal){
				$contenuCodePostal = $decoupeLigne[$i];
			}
			if ($i == $colonneVille){
				$contenuVille = $decoupeLigne[$i];
			}
		}
		
		// On rédige le "Record" du fichier xml, en complétant avec les valeurs récupérées précédemment
		$texte .='
	<Record RecID="0">
		<FldValue FldName="nom">
			<StrVal>'. $contenuNomContact .'</StrVal>
		</FldValue>
		<FldValue FldName="type">
			<StrVal>Contact</StrVal>
		</FldValue>
		<FldValue FldName="adr">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="cp">
			<StrVal>'. $contenuCodePostal .'</StrVal>
		</FldValue>
		<FldValue FldName="ville">
			<StrVal>'. $contenuVille .'</StrVal>
		</FldValue>
		<FldValue FldName="ind1">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="ind2">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="ind3">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="linesup1">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="linesup2">
			<StrVal></StrVal>
		</FldValue>
		<FldValue FldName="linesup3">
			<StrVal></StrVal>
		</FldValue>
	</Record>';
	}
	fclose($fichier);
}
En espérant que quelqu'un puisse m'aider.. Merci!

Re: fgets -> ligne en double

Posté : 18 avr. 2011, 12:48
par xTG
A la vue de ton code il n'y a pas de raison...
Vérifies que ton fichier n'a pas deux fois la même ligne à la fin.

PS : c'est quoi cette horrible boucle for ? Si tu l'utilises ainsi autant faire un while...
for($i=1; $i <= count($decoupeLigne); $i++)

Re: fgets -> ligne en double

Posté : 18 avr. 2011, 14:11
par yeste64
Justement je n'ai pas deux fois la même ligne à la fin de mon fichier...
Pour la boucle for, j'ai commencé avec une boule foreach, mais çane marchait pas.. C'est pour ça que j'ai utilisé ceci

Re: fgets -> ligne en double

Posté : 18 avr. 2011, 14:24
par macgawel
Pour la boucle FOR, pourquoi tu ne fais pas carrément, à la place de la boucle :
if (isset ($decoupeLigne[$colonneContact])) $contenuNomContact = $decoupeLigne[$colonneContact]
if (isset ($decoupeLigne[$colonneCodePostal])) $contenuCodePostal = $decoupeLigne[$colonneCodePostal];
if (isset ($decoupeLigne[$colonneVille])) $contenuVille = $decoupeLigne[$colonneVille];
Pour ton fichier, tu n'aurais pas une ligne vide à la fin ?
Parce que dans ce cas, vu ta boucle (et tes tests) tu ne modifie pas tes variables $contenu*

Si tu veux vérifier vitye fait, tu peux déjà réinitialiser tes variables $contenu* au début de ta boucle WHILE, et voir ce que ça te donne...

[Edit] Au passage, tu peux peut-être utiliser fgetscsv() au lieu de fgets + explode ?

Re: fgets -> ligne en double

Posté : 18 avr. 2011, 15:10
par yeste64
J'avais en effet une ligne vide à la fin de mon fichier..
Et tu as aussi raison pour ma boucle, autant faire comme tu as dit, c'est beaucoup plus simple!
Merci beaucoup à vous deux!