tris dans un fichier

tris dans un fichier - Perl - Programmation

Marsh Posté le 08-04-2008 à 15:37:24    

Salut à tous,
 
j'ai un fichier du type:
 

Code :
  1. X|12|X|X
  2. X|1|X|X
  3. X|2|X|X
  4. X|122|X|X
  5. X|132|X|X
  6. X|172|X|X
  7. X|125|X|X


 
j'ai besoin d'en faire un tri par rapport à la 2e colonne. du coup j'ai trouvé ça:
 

Code :
  1. if(open (FILE,"<fichier.txt" )){
  2.    @files=<FILE>;
  3.    close FILE;
  4. }
  5. @out = sort {
  6.         (split '|', $a, 4)[1] <=>
  7.         (split '|', $b, 4)[1]
  8.     } @files;


 
ça marche nikel. Quelle est ma question vous direz vous...en fait c le 4.... il sert à quoi??? j'ai essayé avec d'autre chiffre ça marche aussi... pourquoi? merci beaucoup

Reply

Marsh Posté le 08-04-2008 à 15:37:24   

Reply

Marsh Posté le 08-04-2008 à 15:46:57    

c'est la limite et ça sert strictement à rien dans ton cas car tu n'utilises que le 2eme élement ( [1] ) du tableau retourné par le split: voir la doc


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 08-04-2008 à 16:20:52    

Merci beaucoup,
 
effectivement je cherchais au niveau des spécifications du sort...

Reply

Marsh Posté le 08-04-2008 à 17:53:49    

Re, ... cette fois j'ai un tri multi critère disons qu'en fait mon fichier soit déjà trier par le premier attribut donc :
 
j'ai un fichier du type:
 

Code :
  1. A|12|X|X
  2. A|1|X|X
  3. B|2|X|X
  4. B|122|X|X
  5. B|132|X|X
  6. C|172|X|X
  7. C|125|X|X


 
j'ai besoin que le résultat soit le suivant :
 
 

Code :
  1. A|1|X|X
  2. A|12|X|X
  3. B|2|X|X
  4. B|122|X|X
  5. B|132|X|X
  6. C|125|X|X
  7. C|172|X|X


 
 
si j'ai bien compris y a une histoire de || mais j'ai l'impression que c'est juste dans le cas d'egalité???? :??:  :??:  
merci d'avance..


Message édité par OyT le 08-04-2008 à 17:57:25
Reply

Marsh Posté le 16-04-2008 à 18:22:52    

Code :
  1. if(open (FILE,"<fichier.txt" )){
  2.    @files=<FILE>;
  3.    close FILE;
  4. }
  5. @out = map $_->[0],
  6.   sort {
  7.     $a->[1] cmp $b->[1] or
  8.     $a->[2] <=> $b->[2]
  9.   }
  10.   map [$_, split /\|/], @files;


Ca va te trier sur ton premier champ (alphanumerique), puis sous-trier sur le second (numérique)
A+,
 
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-04-2008 à 18:41:31    

Une petite explication sur mon post precedent:
Le premier map, transforme une ligne en un array (anonyme) de 5 elements, le premier étant la ligne, et les 4 suivants, les 4 parties de la ligne découpée. Ca sert a separer les champs a trier pour y acceder tout en gardant la ligne.
On a alors un tableau de tableaux a 5 elts, ie les elements du tableaux sont des references sur des tableaux (anonymes) a 5 elts.
On trie ce tableau de tableaux en fonction des champs:
$a->[1] cmp $b->[1] tri alphabétique. Si le premier champ des deux elements (donc ici le 2e element, d'indice 1, des deux tableaux a 5 elements comparés) sont distincts, on ne va pas plus loin, mais si ils sont égaux, $a->[1] cmp $b->[1] vaut 0, et on va donc evaluer le or..., et comparer sur le 2e champ.
On est alors maintenant avec un tableau trié de tableaux a 5 elements.
Le dernier map recupere la premier element de chaque tableau a 5 element, qui est donc la ligne figurant dans le tableau initial.
J'ai adapté a partir d'un exemple de Randall Schwartz himself [:plat00n2]  
A+,


Message édité par gilou le 16-04-2008 à 21:24:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-04-2008 à 12:12:54    

Merci beaucoup...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed