compter nombre de ligne entre deux mots

compter nombre de ligne entre deux mots - Perl - Programmation

Marsh Posté le 28-12-2015 à 12:34:05    

Salut,
 
je début un peut avec Perl, et je sais pas trop comment prendre mon probleme en main, donc si vous aviez une idée.
 
en fait, je dois compter les nombre de ligne qu'il y a entre deux mots dans un fichier text.
 
en gros, la source est du genre :

debut liste_1
 a
 b
 c
fin
 
debut liste_2
 d
 e
 f
fin
 


 
et j'aurai besoin de connaitre le nombre de ligne qu'il y a par exemple dans liste_2
 
voila, si vous avez une petite idée pour m’orienter ?
merci d'avance


---------------
#mais-chut
Reply

Marsh Posté le 28-12-2015 à 12:34:05   

Reply

Marsh Posté le 28-12-2015 à 14:04:05    

Bon, je crois que j'ai ressui, c’est surement très très crade, mais ca semble marcher  :D  
 
 

#!/usr/bin/perl -w
 
use strict;
use Date::Manip;
use LWP::Simple;
 
 
##my $baseDir = '/log/Accounting';
my $baseDir = '/home/moi/FreeURL';
my $resultDir = "$baseDir/Results";
my $dataDir = "$baseDir/DataBase";
my $url = 'http://cfg-store/P/DatabaseP.bc';
 
my $ins = 0;
my $CountFreEURL = 0;
 
 
getstore($url, "$dataDir/databaseP.bc" );
open(DATABASE, "$dataDir/databaseP.bc" )     || die("$0: Cannot open '$dataDir/databaseP.bc': $!n" );
 
 
while(<DATABASE> ) {
    chomp;
    next if(/^Id/);
    next if(/^$/);
    next if(/^#/);
    next if(/^s;;/);
    next unless /S/;
 
    if ((/debut list_2/)&&($ins==0)) {
        printf ("%sn", $_);
        $ins = 1;
    }
    elsif ((/fin/)&&($ins==1)) {
        print ("Exitingn" );
        $ins = 0;
    }
    elsif ($ins==1) {
        $CountFreEURL+=1;
        printf ("tEntry:%sn", $_);
    }
         
}
printf ("Count: %dn", $CountFreEURL);
exit 0;


c'est chaud bouillant le perl en fait :)


---------------
#mais-chut
Reply

Marsh Posté le 28-12-2015 à 16:05:13    

Code :
  1. if ((/debut list_2/)&&($ins==0)) {
  2.        printf ("%sn", $_);
  3.        $ins = 1;
  4.    }
  5.    elsif ((/fin/)&&($ins==1)) {
  6.        print ("Exitingn" );
  7.        $ins = 0;
  8.    }
  9.    elsif ($ins==1) {
  10.        $CountFreEURL+=1;
  11.        printf ("tEntry:%sn", $_);
  12.    }


 
Si tu veux compter qu'une seule section entre debut list_2 et fin, ça peut se simplifier:
 

Code :
  1. if (/debut list_2/) {
  2.    print $_, "\n";
  3.    ++$CountFreEURL;  # ça va pouvoir faire double emploi: flag et compteur
  4. }
  5. elsif ($CountFreEURL) {
  6.    if (/fin/) {
  7.        print "Exiting\n";
  8.        last;  # on sort de la boucle ici, c'est ce qui permet de ne pas se préoccuper du traitement des lignes restantes
  9.    }
  10.    print "\tEntry:", $_, "\n";
  11.    ++$CountFreEURL;
  12. }


 
A+,


Message édité par gilou le 28-12-2015 à 16:16:55

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

Marsh Posté le 28-12-2015 à 16:48:04    

Bref, en reprenant le tout, ça pourrait ressembler à:

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. use Date::Manip;
  7. use LWP::Simple;
  8.  
  9. ##my $baseDir = '/log/Accounting';
  10. my $baseDir = '/home/moi/FreeURL';
  11. my $resultDir = "$baseDir/Results";
  12. my $dataDir = "$baseDir/DataBase";
  13. my $url = 'http://cfg-store/P/DatabaseP.bc';
  14.  
  15. getstore $url, "$dataDir/databaseP.bc";
  16. open my $db_handle, "$dataDir/databaseP.bc";
  17. my $CountFreEURL = 0;
  18.  
  19. while (<$db_handle> ) {
  20.    chomp;
  21.    next unless /\S/;  # ça comprends le cas /^$/
  22.    next if(/^(Id|#|\s;;)/);  # c'est pas \s*;; dans le 3e cas?
  23.  
  24.    if (/debut list_2/) {
  25.        print $_, "\n";
  26.        ++$CountFreEURL;  # ça va pouvoir faire double emploi: flag et compteur
  27.    }
  28.    elsif ($CountFreEURL) {
  29.        if (/fin/) {
  30.            print "Exiting\n";
  31.            last;  # on sort de la boucle ici, c'est ce qui permet de ne pas se préoccuper du traitement des lignes restantes
  32.        }
  33.        print "\tEntry:", $_, "\n";
  34.        ++$CountFreEURL;
  35.    }        
  36. }
  37. close $db_handle;
  38.  
  39. print "Count: ", $CountFreEURL, "\n";
  40. exit 0;


 
A+,


Message édité par gilou le 28-12-2015 à 16:52:47

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

Marsh Posté le 28-12-2015 à 18:46:03    

Merci tout plein , je regarde ça demain en arrivant au boulot  
 
:)


---------------
#mais-chut
Reply

Sujets relatifs:

Leave a Replay

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