probleme parser et regroupe des elements

probleme parser et regroupe des elements - Perl - Programmation

Marsh Posté le 01-04-2011 à 10:02:52    

Bonjour,
j'ai un souci , voici un fichier d'entree:
 
 
J'ai pense a mettre tout dans un hash mais faut pas que je perds le couple a chaque fois....
 
 
 
 
 
Merci


Message édité par shadow19c le 13-04-2011 à 09:15:07
Reply

Marsh Posté le 01-04-2011 à 10:02:52   

Reply

Marsh Posté le 01-04-2011 à 15:15:19    

Bonjour,
 
J'ai mis vos données dans un fichier nommé couples .txt, et ecrit le script couples.pl suivant:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie qw(open close);   # open/close succeed or die
  5.  
  6. # fichier de données
  7. my $filename = "couples.txt";
  8. my @datas;
  9. open my $fh, '<', $filename;
  10. while (<$fh> ) {
  11.  if (/^(?:.+)-(\d+)\tAster-(\d+)$/o) {
  12.    chomp;
  13.    push @datas, [$_, $1, $2, 0];
  14.  }
  15. }
  16. close $fh;
  17.  
  18.  
  19. @datas = sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] } @datas;
  20. my $current;
  21. foreach (@datas) {
  22.  if ($current) {
  23.    if (($_->[1] == ($current->[1] + 1))
  24.     && (($_->[2] == ($current->[2] + 1)) || ($_->[2] == ($current->[2] - 1)))) {
  25.      $current->[3] = 1;
  26.      $_->[3] = 1;
  27.    }
  28.  }
  29.  $current = $_;
  30. }
  31.  
  32. my @result;
  33. foreach (@datas) {
  34.  if ($_->[3]) {
  35.    push @result, $_->[0];
  36.  }
  37. }
  38.  
  39. print join("\n", @result), "\n";


Sur vos données initiales, ça me donne ceci:

C169v2-00156    Aster-03172
C169v2-00157    Aster-03173
C169v2-00194    Aster-03056
C169v2-00195    Aster-03055
C169v2-00365    Aster-01092
C169v2-00366    Aster-01093
C169v2-00367    Aster-01094
C169v2-00444    Aster-05312
C169v2-00445    Aster-05313
C169v2-00446    Aster-06835
C169v2-00447    Aster-06836
C169v2-00604    Aster-06241
C169v2-00605    Aster-06242
C169v2-00624    Aster-06810
C169v2-00625    Aster-06811
C169v2-00994    Aster-07502
C169v2-00995    Aster-07503
C169v2-01147    Aster-04997
C169v2-01148    Aster-04996
C169v2-02608    Aster-00719
C169v2-02609    Aster-00720
C169v2-02880    Aster-09326
C169v2-02881    Aster-09327
C169v2-02882    Aster-09328
C169v2-02883    Aster-09329
C169v2-03065    Aster-05822
C169v2-03066    Aster-05821
C169v2-03565    Aster-07197
C169v2-03566    Aster-07198
C169v2-03710    Aster-02870
C169v2-03711    Aster-02869
C169v2-03712    Aster-02868
C169v2-04030    Aster-04240
C169v2-04031    Aster-04241
C169v2-04634    Aster-01994
C169v2-04635    Aster-01993
C169v2-04677    Aster-07022
C169v2-04678    Aster-07023
C169v2-05018    Aster-04700
C169v2-05019    Aster-04699
C169v2-05054    Aster-06213
C169v2-05055    Aster-06214
C169v2-05056    Aster-06212
C169v2-05057    Aster-06211
C169v2-05077    Aster-05947
C169v2-05078    Aster-05946
C169v2-05245    Aster-01477
C169v2-05246    Aster-01478
C169v2-05264    Aster-06056
C169v2-05265    Aster-06055
C169v2-06011    Aster-00116
C169v2-06012    Aster-00117
C169v2-06080    Aster-00115
C169v2-06081    Aster-00114
C169v2-06088    Aster-00184
C169v2-06089    Aster-00185
C169v2-06885    Aster-03281
C169v2-06886    Aster-03282
C169v2-07283    Aster-00641
C169v2-07284    Aster-00642
C169v2-07458    Aster-04764
C169v2-07459    Aster-04765
C169v2-08190    Aster-09000
C169v2-08191    Aster-08999
C169v2-09366    Aster-03745
C169v2-09367    Aster-03744


Comment l'algo marche:
Pour chaque ligne lue, je parse avec une expression régulière ad-hoc et construis un tableau anonyme a 4 entrées, ma première entrée est la ligne lue (moins son retour chariot final), la seconde la valeur numérique après le premier - et avant la tabulation, la troisième entrée la valeur numérique après le second - et avant la fin de ligne, et la 4e entrée, 0, pour un indicateur positionné plus tard.
exemple: ligne lue C169v2-09367    Aster-03744 ==> tableau anonyme [C169v2-09367    Aster-03744, 09367, 03744, 0]
Je range ce tableau anonyme dans un tableau global @datas (ie chaque élément de @datas est une référence à un tableau anonyme ainsi créé).
Ensuite je trie @datas suivant les deux valeurs numériques des tableaux anonymes qui constituent ses éléments (ie on ordonne @datas par rapport a la valeur associée à C169v2, et en cas d'égalité, par rapport à la valeur qui suit  Aster).
Ensuite, je parcours @datas (trié) et je teste si la valeur pour C169v2 de deux éléments successifs se suit (et est croissante, puisque j'ai trié). Si oui je teste si le valeur pour Aster se suit (dans un sens ou l'autre). Si oui, je positionne l'indicateur (le 4e champ du tableau anonyme) a 1 pour ces deux éléments successifs.
Enfin, je parcours @datas, et crée un tableau @result dont le contenu est le premier champ du tableau anonyme (donc ce qui a été lu dans le fichier) pour les éléments dont l'indicateur a été positionné à 1.
 
A+,


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

Marsh Posté le 13-04-2011 à 13:01:44    

:hello:
>> Il n'y a pas le debut du message
Ben si vous parlez de votre message initial, c'est suite a une édition que vous avez faite, non?

Citation :

Message édité par shadow19c le 13-04-2011 à 09:15:07


A+,


Message édité par gilou le 13-04-2011 à 13:02:34

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

Sujets relatifs:

Leave a Replay

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