Comment classer les données par ordre croissant en fonction du 2eme mot. [Résolu]

Signaler
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
-
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
-
Salut



pour l'exemple qui suit



un fichier INI test.ini



[P1]
test=blabla 100
test2=bloblo 150
[P2]
test3=blibli 60
test4=bleble 90





je voulais savoir si il y a une possibilité de classer les données par ordre croissant en fonction du 2eme mot
que ça retourne comme ça :






bloblo
blabla
bleble
blibli




ou comme ça




bloblo

blabla


bleble

blibli


donc en gros je veu que ça classe du plus grand au plus petit lors d'une loop ou regex




j'espère que j'ai été clair.
merci d'avance

13 réponses

Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Ah oui, je n'avais pas vu ton pseudo ^^
Je pense que tu veux faire ça en mIRC donc.
Bon... je me souviens plus trop, mais je viens de regarder, là. A mon avis pour commencer il serait préférable de lire ton fichier avec $read() et non $readini() (sauf si tes sections sont nommées "1 2 3 etc"). Comme ça tu fais une boucle sur chaque ligne, et tu peux par exemple matcher sur "=". A partir de là tu fais un $gettok(<ligne>,2,$asc(=)) puis tu tokenizes sur l'espace et tu rajoutes donc "$2 $1" à ta variable globale. Enfin tu effectues un $sorttok(<var>,C,n) et voilà...
J'ai bon ? :p
Bon je dis peut-être de la merde, mais c'est comme ça que je ferais (voire même avec $fread() ..)
Donc en gros, si ton fichier n'est pas trop gros, ça donnerait un truc du genre : (de mémoire, donc pas testé)
var %result, %lines $lines(fichier.ini), %line 1 ;je ne sais plus si on part de 0 ou 1
while (%line <= %lines) {
if (= isin $read(fichier.ini,%line)) {
var %item $gettok(%line,2,$asc(=))
tokenize 32 %item
%result = %result $+ $2 $1 $+ ,
}
}
bon, et à partir de là tu retourne la moitié du truc.
Bon, j'ai fait du caca en fait, mais j'ai pas le temps de corriger je vais en cours, donc j'envoie quand même le commentaire au cas où :p
Bonne chance

Cordialement, uaip.
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Nan, c'est pas si con de faire ca, mais ca fait boucler nous meme sur des lignes qu'on veut pas,

moi j'aurais plus jouer sur $readini, ou alors sauver le fichier en hash table (-i), mais le principe reste le meme.

Enfin bon, comme ca ete dis, si le fichier est gros, ca plantera,  avec /filter, ca te prend une ligne et ca plantera pas :p

filter -tu 2 32 fichier.ini sortie.txt

il me semble que cela te mettra ds le fichier sortie.txt les lignes ds l'ordre, mais je suis pas sur du tout, -t 2 32 signifie qu'on trie par rapport au deuxieme token separe par un caractere 32, l'espace, et -u signifie un tri numerique, je regarderai plus en detail ce soir si tu n'as pas trouve :)
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Moi je ferais une boucle qui stocke tous les items inversés (exemple : 100 blabla au lieu de blabla 100) puis je les rangerais en triant numériquement dans l'ordre croissant (et retournerais cette même liste avec uniquement les 2èmes tokens).

Mais euh... l'algo dépend notamment du langage dans lequel tu fais ça. Or, tu n'as pas précisé...

Cordialement, uaip.
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
1
salut
merci a vous deux ^^

bon j'ai eus 2 idée d'apres vos reponse merci :p

selonmais j'ai preferer la reponse de WIMS avec filter



alias wsort {
  var %x $1,%y $2,%ntok $calc($wildtok(%x,*,0,32) + $wildtok(%y,*,0,32))
  tokenize 124 $regsubex($str(x,%ntok),/x/g,$readini(x.ini,P1,$gettok(%x,\n,32)) $+ $chr(124) $readini(x.ini,P2,$gettok(%y,\n,32)) $+ $chr(124))
  write test.txt $*
  filter -tue 2 32 test.txt test1.txt
  return $regsubex($str(x,$lines(test1.txt)),/x/g,$gettok($read(test1.txt,\n),1,32) $+ $chr(32))
}

utilisation "$wsort(test test2,test3 test4) | remove test.txt | remove test1.txt"

returne blobloblablablebleblibli

esque vous evez une idée plus simple peut etre ça va m'aidé

mais je me rend compte que ce que je cherche a faire sera fait avec $sorttok

puisque je peux mettre les données renversé donc

[P1]
test=100blabla
test2=150bloblo
ect...

merci aussi UAIP
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Wow, ton code, meme s'il utilise des trucs jolie, est vraiment bizarre, je comprend pas tout ce pre-traitement, si tu n'utilises que la ligne du /filter, il te retourne toute les lignes du fichier, mais avec les ligne contenant les = trie non ? je pense pas que tout ce que tu fasses soit necessaire, /filter devrait suffire, j'ai pas encore teste de le faire donc je sais pas trop.
Messages postés
1726
Date d'inscription
vendredi 12 septembre 2003
Statut
Membre
Dernière intervention
13 juin 2009
1
Une question surement idiote, mais pourquoi indexer par des clés du genre "test"/"test2"... dans le fichier INI, si au final tu veux trier en utilisant comme index la valeur numérique de la chaîne?

A la limite, ça vaudrait le coup d'organiser les données avec un fichier XML non? Si tu veux pouvoir organiser un peu comme tu veux, trier dans tous les sens etc Enfin je dis ça parce que actuellement je bosse sur un projet où j'ai centralisé mes données dans un tel fichier et c'est assez souple d'utilisation.

Alors après à voir si c'est pas trop galère à faire en sorte de récup les données avec du code mIRC mais bon, ça doit pas être sorcier surtout avec les regexp.

Enfin, disons qu'à mon sens (à juste titre ou non), j'ai l'impression que ton pb se situe plus dans la façon de pouvoir organiser les données de façon à pouvoir les trifouiller de façon simple, que de réaliser réellement une routine de tri...
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Bon bah comme prévus, en testant :

//filter -ctue 2 32 fichier.ini fichier.txt *=*

ça exclus les lignes des sections, ça prend que les lignes correspondant a item=value, et ça trie bien.
Après il y a moyen de faire ce que tu veux, de viré la partie avec le =, facilement, avec seulement une ligne de plus, pas besoin de tout ton mic mac :)

même si je déconseille l'usage d'un fichier xml, le dernier paragraphe de tofu est sans doute vrai, si tu expliquais un peu le but du truc, on pourrait mieux comprendre
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Je ne connaissais pas /filter (du moins pas assez pour savoir qu'elle faisait ça ^^)
En effet ça a l'air beaucoup plus simple.
Et oui comme le dis tofu, s'il y a moyen que tu organises ton fichier pour récupérer les données plus facilement, autant le faire.
Je pense que, si on a bien compris ton problème, le dernier message de wims devrait pouvoir le résoudre.

Cordialement, uaip.
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
1
en effet j'ai posté un simple exemple pour avoir une idée de ce que je pourai avoir besoin mais bon
ce que je fait est different il y a plusieurs données dans le fichier et c'est un tri de chan par nombre de text, de join, ou nombre de chatteurs present ect. et ça va etre presenté dans une list dialog par ordre croissant selon le nombre demandé


donc il y aura une loop qui va classer les chan en ordre croissant ensuite je les didtok dans la list donc j'avais dis que $sorttok va m'aidé parceque je comptais faire une regex
donc les chan seront placé selon la demande (par text,join, ou autre..) quelquchose comme ça


%x = 150 #chan1|200 #chan2|50 #chan3|75 #chan4


ici $sorttok(%x,32,nr) va classé par ordre croissant ensuite on recupere rien que les chan pour les mettre dans la list


voilà..
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Hihi, cela revient exactement à mon premier commentaire

Cordialement, uaip.
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
1
a peu pres UAIP

parceque c'est comme ça dans le fichier

#chan1
text=100
join=20
ect..

et selon les données chaque #chanN va avoir un nombre a coté sois text sois join ect.

mais comme j'ai dis c'etait un exemple pour avoir une idée pas plus merci a vous :)
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Ah non mais présenté comme ça, ça n'a rien à voir. C'est beaucoup plus simple. Je reposte ce soir, car là je suis en cours, je te propose une méthode.
Evidemment je pense que d'autres commentaires viendront d'ici là.

Cordialement, uaip.
Messages postés
871
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2012
1
pas besoin c'est dejà fait
mais si tu veu fait le peu etre ça sera encore mieu que le mien ^^