Bonjour,
J'ai mis vos données dans un fichier nommé couples .txt, et ecrit le script couples.pl suivant:
Code :
#!/usr/bin/perl use strict; use warnings; use autodie qw(open close); # open/close succeed or die # fichier de données my $filename = "couples.txt"; my @datas; open my $fh, '<', $filename; while (<$fh> ) { if (/^(?:.+)-(\d+)\tAster-(\d+)$/o) { push @datas, [$_, $ 1, $ 2, 0]; } } @datas = sort { $a-> [1] <=> $b-> [1] or $a-> [2] <=> $b-> [2] } @datas; my $current; foreach (@datas) { if ($current) { if (($_->[1] == ($current->[1] + 1)) && (($_->[2] == ($current->[2] + 1)) || ($_->[2] == ($current->[2] - 1)))) { $current->[3] = 1; $_->[3] = 1; } } $current = $_; } my @result; foreach (@datas) { if ($_->[3]) { } }
|
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é! --