Classer les éléments d'un fichier texte

Eléphant du PHP | 92 Messages

12 juil. 2005, 11:28

J'ai ce programme qui insère les valeurs d'un fichier texte dans un autre fichier texte :
//Ouverture du fichier 1 
$fichier1="assimile_5h.txt"; 
$o_file = fopen($fichier1, "a"); 
//Ouverture du fichier 2 
$fichier2="assimile_03.txt"; 
$a_fichier2 = file($fichier2); 

//On parcours chaque ligne du fichier 2 
foreach($a_fichier2 as $ligne) { 
    //Ecriture de cette ligne dans le fichier texte 
    fputs($o_file, $ligne); 
} 
fclose($o_file);
et je souhaiterai au moment où il me met les valeurs du fichier2 dans fichier1 qu'il me les classe par odre croissant. Plus clairement qu'il m'insère les nouvelles valeurs au bon endroit dans le fichier1.
Pour le moment les valeurs du fichiers2 sont mises à la fin du fichier1

J'ai trouvé des fonctions permettant de trier array_multisort avec l'option sortasc ; mais je vois pas trop comment les utiliser.
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 juil. 2005, 11:43

C'est selon quels critères que tu veux les trier ?

Je me rapelle de la syntaxe de tes fichiers mais ce n'est pas le cas de tout le monde

Je pense qu'un exemple de fichier avant et après tri pourrait nous aider à t'aider (pas mal la phrase 8) )
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

12 juil. 2005, 13:24

ok.

voici le fichier avec les valeurs mises à la fin du fichier :

-1.45 49 63.6
1.6 49 62.4
1.75 49 58.7
1.9 49 46.9
2.05 49 35.2
2.2 49 31.3
2.35 49 27.5
2.5 49 35.7
2.65 49 40.5
2.8 49 46.1
2.95 49 48.9
3.1 49 54
3.25 49 60.3
3.4 49 65.5
3.55 49 68.1

que les valeurs qui se trouvaient à la fin soient insérer dans le fichier dans l'ordre de croissant par rapport à la seconde colonne puis par rapport à la première.
En espérant que cela soit plus clair
Modifié en dernier par speddy1406 le 12 juil. 2005, 13:58, modifié 1 fois.

Eléphant du PHP | 104 Messages

12 juil. 2005, 13:32

Salut,

Pourquoi c'est pas en base de données ?

Si tu tiens à faire le traitement en PHP, va falloir travailler avec des tableaux pour trier et comparer.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 juil. 2005, 13:33

Quand je disais exemple, je pensais à quelques lignes :lol: Si tu pouvais éditer ton post, merci

Sinon,

soit fic_dest ton fichier de destination (celui qui doit être trié)
soit fic_dep celui qui contient les données à ajouter à fic_dest

il faut que tu extraye le contenu de fic_dest (avec file)
tu extrait le contenu de fic_dep que tu ajoute dans le tableau qui contient le contenu de fic_dest
tu trie ce tableau avec array_multisort()
Et enfin, tu met le contenu de ce tableau trier dans fic_dest en ayant préalablement supprimé le contenu (fopen("fic_dest", "w"))

Bon courage pour le codage :wink:

Je devrais être dans le coin cet aprèm
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 104 Messages

12 juil. 2005, 13:35

Juste une petite chose "de rien du tout", tu utilises deux séparateurs différents, le point et la virgule !

Mammouth du PHP | 19672 Messages

12 juil. 2005, 13:59

Modération : speeddy1406, merci d'éditer ton post avec les données et en couper les trois quarts, merci. C'est du remplissage inutile: crois-tu vraiment qu'on va s'amuser à lire chaque ligne ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 92 Messages

12 juil. 2005, 14:23

c'est bon j'ai édité mon post.
excusez moi.

Eléphant du PHP | 92 Messages

12 juil. 2005, 14:26

voila ce que j'ai codé mais il me met une erreur sur la ligne du tri :

//Ouverture du fichier 1
$fichier1="assimile_5h.txt"; 
$o_file = fopen($fichier1, "a"); 
//Ouverture du fichier 2 
$fichier2="assimile_03.txt"; 
$a_fichier2 = file($fichier2); 

//On parcours chaque ligne du fichier 2 
foreach($a_fichier2 as $ligne) { 
    //Ecriture de cette ligne dans le fichier texte  
    fputs($o_file, $ligne); 
} 
fclose($o_file)
array_multisort($o_file, SORT_ASC);

fputs($o_file, array_multisort); 
je pense que j'extrais bien les données des deux fichiers, puis je les données se mettent dans le fichier1.
mais pour le tri, je pense que je n'utilise pas la fonction comme il faut.
Peut m'expliquer comment cette fonction fonctionne.
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 juil. 2005, 14:28

soit fic_dest ton fichier de destination (celui qui doit être trié)
soit fic_dep celui qui contient les données à ajouter à fic_dest

il faut que tu extraye le contenu de fic_dest (avec file)
tu extrait le contenu de fic_dep que tu ajoute dans le tableau qui contient le contenu de fic_dest
tu trie ce tableau avec array_multisort()
Et enfin, tu met le contenu de ce tableau trier dans fic_dest en ayant préalablement supprimé le contenu (fopen("fic_dest", "w"))
Si tu lit bien ce que j'ai mis en gras, tu doit comprendre ton erreur

C'est pas pour t'embeter mais après t'avoir aider plusieurs fois, j'aimerais que tu essaye de coder par toi même
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

12 juil. 2005, 14:56

Si je reprend étape par étape :
fputs($o_file, $ligne); 
Cette ligne me copie bien les données du fichier2 dans fichier1.

Mais pour trier le contenu de ce tableau avec la fonction arraymultisort
est ce je peux écrire cela
$trier=fputs($o_file, $ligne);
array_multisort($trier);

et ensuite
fopen($trier,"w");
Est ce que çà pourrait être correct ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 juil. 2005, 14:59

prend l'habitude d'aller consulter un manuel php du style php.net

fopen sert à ouvrir un fichier, pas à extraire son contenu
file rempli cette fonction
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

12 juil. 2005, 15:20

oui excuse moi j'avais modifié dans le test que j'ai fait et je t'ai mis la mauvaise ligne donc je reprend

$fichier_trie = file($trier);

et ensuite faire

fputs($trier);
fclose ($trier);

est ce que comme çà c'est mieux où pas ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 juil. 2005, 15:32

dans l'idée, t'es pas loin
$a_fichier1 = file("fichier1");
$a_fichier2 = file("fichier2");

$a_fichier_merge = array_merge($a_fichier1, $a_fichier2);

//trie selon les valeurs numériques dans l'ordre décroissant
$a_fichier_trie = array_multisort($a_fichier_merge, SORT_NUMERIC, SORT_DESC)

$fic_desc = fopen("fichier2", "w");
foreach($a_fichier_trie as $ligne) {
  fputs($fic_dest, $ligne);
}

fclose($fic_dest);
devrait suffire.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

12 juil. 2005, 16:25

ok.
j'ai modifié tin code par rapport à mes fichiers et voila ce que çà donne :
$a_fichier1 = file("assimile_5h.txt"); 
$a_fichier2 = file("assimile_03.txt"); 

$a_fichier_merge = array_merge($a_fichier1, $a_fichier2); 

//trie selon les valeurs numériques dans l'ordre décroissant 
$a_fichier_trie = array_multisort($a_fichier_merge, SORT_NUMERIC, SORT_ASC)

$fic_desc = fopen("assimile_5h.txt","w");
foreach($a_fichier_trie as $ligne) { 
  fputs($fic_desc, $ligne); 
} 

fclose($fic_desc); 
mais malgre tout il me met une parse error sur cette ligne :
$fic_desc = fopen("assimile_5h.txt","w");
çà fait un petit moment que je cherche et fais d'autres tests et pas de solutions... vois-tu où il y a l'erreur ?