8792 sujets

Développement web côté serveur, CMS

Bonjour,

je reçois des fichiers que je dois traiter mais ces derniers ne sont pas toujours formatés de la même façon.

par exemple :
ligne1123312312"__________
lqqfqsdfqbfqsjfqsdfqsd______
qsjfgqsdf_________________
upuebjzbfef_______________

Les "_" représentant des caractères espace.

Ce que je veux faire, c'est lire la totalité du fichier et pour chacune des lignes supprimer chaque espace pour que la fin de ligne s'arête à la fin du texte.
Ca ne me semblait pas si compliqué mais en fait je n'y arrive pas et je trouve pas de réponse.

Connaissez-vous une fonction php qui le fait? un bout de code déjà fait?

Merci d'avance

Je développe tout ça en php
Salut
Fais un petit tour sur la doc PHP, et recherche les fonctions :
- file pour lire un fichier dans un tableau;
- array_walk pour appliquer une méthode aux éléments d'un tableau;
- create_function pour créer le callback de array_walk;
- rtrim pour supprimer les blancs à droite d'une chaîne.
Ca devrait suffire Smiley cligne
a+
Merci pour les infos,

j'ai insisté un petit peu et je me suis créé ce petit bout de code,
si vous vouliez bien me dire ce que ca vaut par rapport au array_walk (fonction que je maitrise pas du tout Smiley smile )


touch("e:\Traitement\SAISIE2\SAISIE2.DAT");
$ligne= fread(fopen($fic, "r"), filesize($fic));
$ligne_par_ligne = explode("\n",$ligne);
$i=0;
while ($i<count($contenu_array)){
	$fp=fopen("e:\Traitement\SAISIE2\SAISIE2.DAT","a");
	fwrite($fp,rtrim($ligne_par_ligne[$i])."\n");
	fclose($fp);
	$i++;
}



merci d'avance
Disons que dans l'esprit, c'est ça. Par contre, d'où sort $contenu_array ? Pourquoi faire une ouverture de fichier pour chaque ligne ?

Avec array_walk (et array_map), on peut s'éviter des boucles rébarbatives, et parfois clarifier le code (si le traitement itératif est simple).

Pour ton traitement, ça donne ça :

// Le fichier à traiter
$fichier = 'doc.txt';
// récupération du contenu du fichier : 1 ligne par élément du tableau + \n à la fin
$lignes = file ($fichier);
// Application de rtrim sur chaque élément du tableau. Chaque ligne est passée par référence
// pour être effectivement modifiée. \n est aussi supprimé par rtrim.
array_walk($lignes, create_function('&$ligne', '$ligne = rtrim($ligne);'));
// Ouverture du fichier en écriture avec écrasement
$handle = fopen($fichier, 'w');
// Ecriture dans le fichier des lignes collées avec \n
fwrite($handle, join("\n",$lignes));
// Fermeture du fichier
fclose($handle);

Il faudrait bien évidemment ajouter tous les tests d'ouverture de fichier mais je m'en dispense pour cet exemple Smiley smile

Voila, j'espère que c'est clair.
A+
:) le contenu_array sort de mon code réalisé grace à un petit pele mele de tout ce que j'ai pu trouver sur Internet Smiley smile

J'avais changé le nom des variable dans mon post pour que se soit plus français pour vous Smiley smile

Je vois maintenant l'interet du array_walk même si son fonctionnement reste encore un peu flou Smiley cligne

array_walk($lignes, create_function('&$ligne', '$ligne = rtrim($lignes);'));


peut tu me dire ce que signifie le "&" devant $ligne?
et d'ou sort ce create_function?

merci bien
Modifié par PaYaP (02 May 2007 - 08:13)
Bonjour
a écrit :
ce que signifie le "&" devant $ligne?

Que la variable est passée par référence et non par valeur. On peut ainsi modifier la variable à l'intérieur de la fonction (tandis que par valeur, c'est une copie de la variable qui est transmise, donc la variable d'origine n'est pas modifiée)

a écrit :
d'ou sort ce create_function?

de la doc Smiley sweatdrop

Si tu as du mal avec create_function, sache que le code que je t'ai proposé peut s'écrire également :

function cb_rtrim ( &$str )
{
   $str = rtrim($str);
}
array_walk($lignes,'cb_rtrim');

C'est ce qu'on appelle une fonction callback. On pourrait traduire ce code par "applique la fonction cb_rtrim à chaque élément du tableau $lignes".
et bien voilà tout est vraiment très clair, reste à me perfectionner au niveau de la variable par référence Smiley smile

merci encore et à bientôt pour d'autres problèmes Smiley smile