IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Recupération liste de fichiers


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut Recupération liste de fichiers
    Bonjour ,

    Mon problème est de pouvoir récupérer un liste de fichiers selon certains critères :
    - l'origine de fichier (en gras )
    - la date des données contenues dans le fichier (quantième en gras et italique)

    Et ne récuperer le numéro de fichier (en italique et gras)

    Les fichiers se présentent sous cette forme :

    PVTOU743-744-cdr1451527_u2si3cr1_071128_90102B04_10003590
    PVTOU743-744-cdr1441542a_u2si3cr1_071130_F36C059A_10160525
    PVTOU743-cdr1431542a_u2si3cr1_071131_F36C059A_10160144

    BW-CDR-20160526235800-2-XXX.XXX.43.63-099522.csv_DF0F172F_249843
    BW-CDR-20160526235800-2-XXX.XXX.244.188-097497.csv_18833B95_283726
    BW-CDR-20160526235800-2-XXX.XXX.37.176-101544.csv_B6E41F53_274085

    J'ai commencé un petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $jour = "145";
    $select = '\w+[\_|\-|\.]';
    $nb = 2;
    $i=4;
    $extract = '/$select\w*$jour/';
    $line1 = "PVTOU743-744-cdr1451527_u2si3cr1_071128_90102B04_10003590";
    $line2 = "PVTOU743-744-cdr1441542a_u2si3cr1_071130_F36C059A_10160525";
     
    @exp1 = split ( /\_|\-|\./, $line1 x $line1 =~ /$select\w*$jour/ );
    @exp2 = split ( /\_|\-|\./, $line2 x $line2 =~ /$select\w*$jour/ );
     
    print "$exp1[$i] - @exp2 - $v2\n";
    chdir "/echange/collecte/dedoublonnage/YU34";
     
    @list_fich = glob ('[0-9A-Z]+*20160525*');
    print "#######################################################\n";
    print @list_fich;
    print "#######################################################\n";
    @list_fich = grep {/PVTOU743/} @list_fich;
    $cache{$_} = -M for @list_fich;
    @liste = sort { $cache{$b} <=> $cache{$a} } @list_fich;
    foreach my $ligne ( @liste ) { 
    	@exp3 = split ( /\_|\-|\./, $ligne x $ligne =~ /$select\w*$jour/ );
    	#$ligne = substr($ligne,$ou_seq ,$long_seq);
    		print "$exp3[$i] - ";
    		++$nb ;
    }
    Sachant que dans la majeur partie des cas qui intéressent j'ai un script qui fonctionne en donnant la position de la date et du numéro de fichier (index dans la chaine de caractères) , MAIS , il arrive dans certains cas que ces valeurs ne soient pas exactes pour tous les fichiers (voir les noms de fichiers).

    Après plusieurs essais infructueux et avant de jeter l'éponge je me demande si parmi vous quelqu'un pourrai me filer un tuyau ??

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    désolé, mais je ne comprends pas ce que tu cherches à faire. Donne peut-être un exemple des données en entrée et du résultat espéré.

    En attendant, juste une petite remarque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $select = '\w+[\_|\-|\.]';
    combine une classe de caractères et des alternatives, et ne produit sans doute pas ce que tu désires. Le mieux est sans doute de se contenter qu'une classe de caractères, sans alternatives et sans caractères d'échappement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $select = qr /[_-.]/;

  3. #3
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    En entrée j'ai ma liste de fichiers ( plusieurs milliers ) et je ne veux garder que les numéros de fichiers , correspondant à une origine et une date données :

    par exemple pour ma premiere liste l'origine est PVTOU743 , la date (en quantième) 144 , et donc le numero correspondant 071130
    pour la deuxieme liste l'origine XXX.XXX.43.63 , la date 20160526 , je recupere donc 099522 .

    ce qui correspondrai dans ma réalité à des listes de plusieurs centaines de nombre consécutifs (normalement)

    autre exemple , avec un grep sur l'origine XXX.XXX.43.63 , avec une liste enorme , je ne veux garder que ceux du 20160526 et extraire la liste des numéros de fichier :

    BW-CDR-20160526200800-2-XXX.XXX.43.63-099476.csv_B032CE15_5950569
    BW-CDR-20160526201300-2-XXX.XXX.43.63-099477.csv_8DF96480_5472682
    BW-CDR-20160526201800-2-XXX.XXX.43.63-099478.csv_F88264D6_5626471
    BW-CDR-20160526202300-2-XXX.XXX.43.63-099479.csv_993A7393_5191042
    BW-CDR-20160526202800-2-XXX.XXX.43.63-099480.csv_2F70E28A_5072001
    BW-CDR-20160526203300-2-XXX.XXX.43.63-099481.csv_CC697C39_5272840
    BW-CDR-20160526203800-2-XXX.XXX.43.63-099482.csv_326F7C4F_4972329
    BW-CDR-20160526204300-2-XXX.XXX.43.63-099483.csv_BE3C73D5_4734767
    BW-CDR-20160526204800-2-XXX.XXX.43.63-099484.csv_CA0CFEBD_4931481
    BW-CDR-20160526205300-2-XXX.XXX.43.63-099485.csv_9577AEBD_4603987
    BW-CDR-20160526205800-2-XXX.XXX.43.63-099486.csv_8123A889_4329537
    BW-CDR-20160526210300-2-XXX.XXX.43.63-099487.csv_9419274A_4679134
    BW-CDR-20160526210800-2-XXX.XXX.43.63-099488.csv_5A480819_4099086
    BW-CDR-20160526211300-2-XXX.XXX.43.63-099489.csv_B8E92E88_3520641

    qui va donc de 099476 à 099489 dans cette liste

    pour mes extractions j'ai un config.ini qui liste toutes mes origines avec les emplacements des dates et numeros de fichier .

    Ce fichier doit contenir :
    - le format de la date ( QQQ - AAAAMMJJ - AAMMJJ )
    - l'indice de debut de date
    - l'indice de fin de date
    - l'indice de debut de séquentialité
    - l'indice de fin de séquentialité
    - si séquentialité jusqu'à 999 et passage à 001
    1 si oui , 0 si non
    - les origines secondaires si existentes

    à définir à l'aide des fichiers deconfig dans le dossier
    /echange/ , par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         TTFILE00_120_025464017_EFZEQ5_665596
                  | |       | |
                  A B       C D
     
         NCX01-s-20160506-389444.cdr_00000000_0
         NCX01-p-20160506-781350.cdr_953AF4D3_641061
                 |      |  |   |
                 A      B  C   D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         format date     : QQQ (quantieme)       AAAAMMJJ
         debut date A    : 10                    9
         fin date B      : 12                    16
         debut seq C     : 20                    19
         fin seq D       : 22                    23
         si jusqu'à 999  : 1                     1
         XXX secondaires :                       NCX01-s
                                                 NCX01-p

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne suis toujours pas sûr d'avoir bien compris, mais s'il s'agit d'extraire le numéro d'ordre des fichiers de ta dernière liste, tu peux faire ce qui suit sur chaque nom de fichier (montré ici sous ls débogueur Perl):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      DB<1> $fic = "BW-CDR-20160526200800-2-XXX.XXX.43.63-099476.csv_B032CE15_5950569";
     
      DB<2> $num = $1 if $fic =~ /-(\d+)\./;
     
      DB<3> p $num
    099476
    J'utilise une expression régulière reconnaissant un groupe de chiffres compris entre un tiret et un point.

  5. #5
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Oui , j'avais aussi pensé à ça , mais , ce n'est pas toujours un tiret et un point , cela peut être _ ou - ou . , et donc pas forcement " $1 " , d'ou ma difficulté ...

  6. #6
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut Mon code complet , en cours de travaux !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    #!/usr/bin/perl
    ##################################################################
    #                                                                #
    #  Auteur : O. Delcamp                                           #
    #  Créé le : 01 mai 2016                                         #
    #                                                                #
    ##################################################################
    #use warnings;
    use lib "$ENV{ECHANGE}/URS/scripts/lib";
    use idaexpl;
    use platine;
    use utf8;
    ##################################################################
    #                                                                #
    #                   Definition des Fonctions                     #
    #                                                                #
    ##################################################################
    # Trouve les manquants entre journées consecutives
    sub manq_consecutives {
    	my $result = "";
    	if ( $_[0] > 1 ) {
    		for ( $a=1 ; $a < $_[0] ; $a++) {
    			$manq = $_[1] + $a ;
    			$manq = sprintf ("%0".$_[2]."d", $manq);
    			$result = $result . "$nom_fichier2$manq*\n                    ";
    		}
    	}
    	return $result;
    }
    # Cherche les trous de sequence dans liste 
    # Arg1 : limite / Arg2 : longueur champ / Arg3 : Liste
    sub recherche_trous ($$@) {
    	my ($fin,$long,@list) = @_;
    	my $fic_res = "";
    	for ( $i=0; $i<$fin; $i++) {
    		$compa = $list[$i];
    		$j = $i+1;
    		$compb = $list[$j]-1;
    		if ( $compa != $compb ) {
    			$compc = $compb - $compa;
    			for ($l=1 ; $l<=$compc ; $l++) {
    				$compb = $compa + $l;
    				$compb = sprintf ("%0".$long."d", $compb);
    				$fic_res = $fic_res . "$nom_fichier$compb*\n                    ";
    			}
    			$j++;
    		}
    	}
    	return $fic_res;
    }
    ##################################################################
    #                                                                #
    #                     Programme principal                        #
    #                                                                #
    ##################################################################
    my $EEC = $ARGV[0];
    my $decalage = $ARGV[1];
    # definition des fichiers et repertoires
    my $path_conf = "/echange/URS/VERIFS/configEEC/";
    my $path_EEC = "/echange/collecte/dedoublonnage/".$EEC."/";
    #my $path_EEC = "/echange/URS/OD/tmp/";
    my $fich_config = "/echange/URS/VERIFS/configEEC/config.ini";
    my $resultat = "$EEC\n\n";
    my @liste;
    my @EEC_sec;
    if ($decalage == undef ) { $decalage = 0; }
    my $controle = 0;
    my $correctif = $decalage;
    ############################################################
    # ouverture du fichier de config EEC                       #
    ############################################################
    $erreur = "\n ************************************************************************\n";
    $erreur = $erreur . " * Le fichier de config de l'EEC $EEC n'éxiste pas\n";
    $erreur = $erreur . " ************************************************************************\n\n";
    open (FIC, $fich_config) or die ($erreur);
    my @fic = <FIC>;
    foreach my $line (@fic) {
    	@trans = split (/;/, $line );
    	#print $trans[0]."-".$EEC."\n";
    	if ( $trans[0] eq $EEC ) {
    		$type_date = $trans[1];
    		$position = $trans[2];
    		$debut_date = $trans[3];
    		$fin_date = $trans[4];
    		$debut_seq = $trans[5];
    		$fin_seq = $trans[6];
    		$champ = $trans[7];
    		$pos_date = $trans[8]-1;
    		$pos_seq = $trans[9]-1;
    		$exist_seq = $trans[10];
    		$deb_eec = $trans[11];
    		$fin_eec = $trans[12];
    		$controle = 1;
    		#print $trans[0]."-".$EEC."\n";
     
    		if ( $trans[11] == 13 ) {
    			for ( $i=$trans[11] ; $i<=$trans[12] ; $i++ ) {
    				$j = $i - 13;
    				$EEC_sec[$j] = $trans[$i];
    				chomp $EEC_sec[$j];
    			}
    			$nb_EEC_sec = $fin_eec - $deb_eec;
    		}
    	}
     
    }
    if ( $controle == 0 ) {
    	print $erreur;
    	exit;
    }
    if ( $EEC_sec[0] eq "" ) { 
    	$nb_EEC_sec = 0;
    }
    #print "Nombre EEC sec : $nb_EEC_sec\n";
    ############################################################
    # definition du type de date dans les fichiers :           #
    # AAAAMMJJ  - AAMMJJ  -  JJMMAAAA  -  QQQ                  #
    ############################################################
    $Quant=`date +%j`;
    @Date=($decalage);
    foreach $Dte (@Date) {
    $Date = FormeDateOpe($Dte);
    $JJ=substr ($Date,0,2);
    $MM=substr ($Date,3,2);
    $AA=substr ($Date,8,2);
    $BB=substr ($Date,6,4);
    $QQ=$Quant + $Dte;
    $QQQ=sprintf ("%03d",$QQ);
    }
    $decalage = $decalage -1;
    @Datev=($decalage);
    foreach $Dtev (@Datev) {
    $Datev = FormeDateOpe($Dtev);
    $JJv=substr ($Datev,0,2);
    $MMv=substr ($Datev,3,2);
    $AAv=substr ($Datev,8,2);
    $BBv=substr ($Datev,6,4);
    $QQv=$Quant + $Dtev;
    $QQQv=sprintf ("%03d",$QQv);
    }
    $decalage = $decalage +2;
    @Datel=($decalage);
    foreach $Dtel (@Datel) {
    $Datel = FormeDateOpe($Dtel);
    $JJl=substr ($Datel,0,2);
    $MMl=substr ($Datel,3,2);
    $AAl=substr ($Datel,8,2);
    $BBl=substr ($Datel,6,4);
    $QQl=$Quant + $Dtel;
    $QQQl=sprintf ("%03d",$QQl);
    }
    chomp($type_date);
    if ($type_date eq "QQQ") {
    	$jour = "$QQQ";
    	$jour_veille = "$QQQv";
    	$jour_lendemain = "$QQQl";
    }
    elsif ($type_date eq "AAMMJJ") {
    	$jour = "$AA$MM$JJ";
    	$jour_veille = "$AAv$MMv$JJv";
    	$jour_lendemain = "$AAl$MMl$JJl";
    }
    elsif ($type_date eq "JJMMAAAA") {
    	$jour = "$JJ$MM$BB";
    	$jour_veille = "$JJv$MMv$BBv";
    	$jour_lendemain = "$JJl$MMl$BBl";
    }
    elsif ($type_date eq "AAAAMMJJ") {
    	$jour = "$BB$MM$JJ";
    	$jour_veille = "$BBv$MMv$JJv";
    	$jour_lendemain = "$BBl$MMl$JJl";
    }
    else { 
    	$jour = "Le script ne trouve pas le type de date dans le fichier de config\n";
    	#print $jour;
    }
    $jour_resultat = "$JJ/$MM/$BB";
    #print "Journée du $jour_resultat\n";
    ############################################################
    # selection des fichiers et extraction de la sequentialité #
    ############################################################
    #print "$type_date+$position+$debut_date+$fin_date+$debut_seq+$fin_seq+$champ+$pos_date+$pos_seq+$exist_seq+$deb_eec+$fin_eec\n";
    my $nb = 0;
    my $nb2 = 0;
    my $nb3 = 0;
    my $long = $debut_date - 1;
    my $debut_chaine = "?" x $long;
    my $long_seq = $fin_seq - $debut_seq + 1;
    my $ou_seq = $debut_seq - 1;
    my $extract = $debut_chaine . $jour . "*";
    my $extract_veille = $debut_chaine . $jour_veille . "*";
    my $extract_lendemain = $debut_chaine . $jour_lendemain . "*";
    chdir "$path_EEC";
    for ($z=0 ; $z<=$nb_EEC_sec; $z++) {
    	if ( $EEC_sec[$z] ne ""  ) {
    		$resultat = $resultat . " --- $EEC_sec[$z] --- \n";
    	}
    	#print " -+- $EEC_sec[$z] -+- \n";
    	@list_fich=();
    	@liste=();
    	@list_vielle=();
    	@veille=();
    	@list_lendemain=();
    	@lelendemain=();
    	@liste_triee=();
    	$nb=0;
    	$nb1=0;
    	$nb2=0;
    	#Teste si repertoire vide
    	if ( my @files = glob("$path_EEC/*") ) {
    		if ( $position == 1 ) {
    			# extraction des fichiers de jour de controle
    			@list_fich = glob("$extract");
    			$nom_fichier = substr ( $list_fich[1],0,$debut_seq-1);
    			$nom_fichier2 = substr ( $list_fich[1],0,$debut_date-1) . "XXX" . substr ($list_fich[1],$fin_date,$debut_seq-$fin_date-1);
    			@list_fich = grep {/$EEC_sec[$z]/} @list_fich;
    			$cache{$_} = -M for @list_fich;
    			@liste = sort { $cache{$b} <=> $cache{$a} } @list_fich;
    			foreach my $ligne ( @liste ) { 
    				$ligne = substr($ligne,$ou_seq ,$long_seq);
    				#print "$ligne - ";
    				++$nb ;
    			}
    			# extraction des fichiers de la veille du jour de controle pour definir le dernier
    			@list_veille = glob("$extract_veille");
    			@list_veille = grep {/$EEC_sec[$z]/} @list_veille;
    			$cache1{$_} = -M for @list_veille;
    			@veille = sort { $cache1{$b} <=> $cache1{$a} } @list_veille;
    			foreach my $ligne ( @veille ) { 
    				$ligne = substr($ligne,$ou_seq ,$long_seq);
    				++$nb2;
    			}
    			# extraction des fichiers de la veille du jour de controle pour definir le dernier	
    			@list_lendemain = glob("$extract_lendemain");
    			@list_lendemain = grep {/$EEC_sec[$z]/} @list_lendemain;
    			$cache2{$_} = -M for @list_lendemain;
    			@lelendemain = sort { $cache2{$b} <=> $cache2{$a} } @list_lendemain;
    			foreach my $ligne ( @lelendemain ) { 
    				$ligne = substr($ligne,$ou_seq ,$long_seq);
    				++$nb3;
    			}
    		}
    		elsif ( $champ == 1 ) {
    			# extraction des fichiers de jour de controle
    			@list_fich = glob($extract);
    			@list_fich = grep {/$EEC_sec[$z]/} @list_fich;
    			$cache{$_} = -M for @list_fich;
    			@liste = sort { $cache{$b} <=> $cache{$a} } @list_fich;
    			foreach my $ligne ( @liste ) { 
    				@trans = split (/\-|\.|\_/, $ligne );
    				#print "$ligne # @trans # $pos_seq #";
    				$ligne = $trans[$pos_seq];
    				#print "$ligne\n";
    				++$nb ;
    			}
    			# extraction des fichiers de la veille du jour de controle pour definir le dernier
    			@list_veille = glob("$extract_veille");
    			@list_veille = grep {/$EEC_sec[$z]/} @list_veille;
    			$cache1{$_} = -M for @list_veille;
    			@veille = sort { $cache1{$b} <=> $cache1{$a} } @list_veille;
    			foreach my $ligne ( @veille ) { 
    				@trans = split (/\-|\.|\_/, $ligne );
    				$ligne = $trans[$pos_seq];
    				++$nb2 ;
    			}
    			# extraction des fichiers de la veille du jour de controle pour definir le dernier
    			@list_lendemain = glob("$extract_lendemain");
    			@list_lendemain = grep {/$EEC_sec[$z]/} @list_lendemain;
    			$cache2{$_} = -M for @list_lendemain;
    			@lelendemain = sort { $cache2{$b} <=> $cache2{$a} } @list_lendemain;
    			foreach my $ligne ( @lelendemain ) {
    				@trans = split (/\-|\.|\_/, $ligne );
    				$ligne = $trans[$pos_seq];
    				++$nb3 ;
    			}
    			$long_seq = length( $liste[0] );
    		}
    		my $dernier_veille = $veille[$nb2-1];
    		my $premier_lendemain = $lelendemain[0];
    		my @liste_triee = sort @liste;
    		my $premier = $liste[0];
    		my $dernier = $liste[$nb-1];
    		my $debut = $liste_triee[0];
    		my $fin = $liste_triee[$nb-1];
    		my $fichiers_trouves = $fin - $debut + 1;
    		my $manquants = $fichiers_trouves - $nb;
    		# si controle du jour meme : pas de controle par rapport au jour suivants
    		if ( $correctif == 0 ) {
    			$premier_lendemain = $dernier +1;
    		}
    		# recherche si passage de 999 à 001 dans la journée et si existence du 000
    		$ref = 0;
    		$correctif = 0;
    		if ( $premier > $dernier ) {
    			$var = 1;
    		}
    		else { $var = 0; }
    		foreach $nomb (@liste) {
    			chomp $nomb;
    			if ( $nomb =~ /^0+$/ ) {
    			$correctif = 1;
    			}
    		}
    		$ref = 9 x $long_seq;
    		$ref = $ref * $var - 1;
    		# recherche des trous de sequence	
    		$seq_veille = $premier - $dernier_veille;
    		$seq_lendemain = $premier_lendemain - $dernier;
    		# si remise à 001 de la sequentialité : pas de controle par rapport aux  jours precedents et suivants
    		chomp $exist_seq;
    		if ( $exist_seq == 0 ) {
    			$dernier_veille = $debut - 1;
    			$premier_lendemain = $fin + 1;
    		}
    		$fichiers_trouves = $ref - $dernier_veille + $premier_lendemain + $correctif;
    		$manquants = $fichiers_trouves - $nb;
    		# Recherche des fichiers manquants
    		if ($fichiers_trouves != $nb) {
    			$resultat = $resultat . "Nombre de fichiers trouvés   = $fichiers_trouves \nNombre de fichiers présents  = $nb\nNombre de fichiers manquants = $manquants\n"; 
    			$resultat = $resultat . "\n";
    			# choix si passage ou non de 999 à 000 ou 001
    			if ( $ref == -1 ) {
    				$resultat = $resultat . "Manque fichier\(s\) : ";
    				$resultat = $resultat . manq_consecutives($seq_veille, $dernier_veille, $long_seq);
    				$resultat = $resultat . recherche_trous($nb, $long_seq,@liste_triee);
    				$resultat = $resultat . manq_consecutives($seq_lendemain, $dernier, $long_seq);
    			}
    			else {
    				@liste1;
    				@liste2;
    				$limite1 = 0;
    				$limite2 = 0;
    				$resultat = $resultat . "Manque fichier\(s\) : ";
     
    				# Decoupage de la liste limite2 à 999 et de 000 ou 001 à limite1
    				for ( $valeur = 0 ; $valeur < $nb ; $valeur++) {
    					if ( $liste[$valeur] < ($ref +2) && $liste[$valeur] > $dernier_veille ) {
    						$liste1[$limite1] = $liste[$valeur];
    						$limite1++;
    					}
    					elsif ( $liste[$valeur] >= 0 && $liste[$valeur] < $premier_lendemain ){
    						$liste2[$limite2]=$liste[$valeur];
    						$limite2++;
    					}
    				}
    				$resultat = $resultat . manq_consecutives($seq_veille, $dernier_veille, $long_seq);
    				$resultat = $resultat . recherche_trous($limite1, $long_seq, @liste1);
    				$resultat = $resultat . recherche_trous($limite2, $long_seq, @liste2);						
    				$resultat = $resultat . manq_consecutives($seq_lendemain, $dernier, $long_seq);
    			}
    		}
    		else {
    			$resultat = $resultat . "Nombre de fichiers trouvés   = $fichiers_trouves \nNombre de fichiers présents  = $nb\nNombre de fichiers manquants = $manquants\n";
    			$resultat = $resultat . "\n";
    		}
    	}
    	else {
    	$resultat = $resultat . "+---------------------------+\n";
    	$resultat = $resultat . "| Le répertoire est vide !! |\n";
    	$resultat = $resultat . "+---------------------------+\n";
    	}
    }	
    print "$resultat";

  7. #7
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Il y a encore certainement des améliorations à apporter , mais ça marche dans 95% des cas. les 5% étant les cas décrits plus haut

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Oui , j'avais aussi pensé à ça , mais , ce n'est pas toujours un tiret et un point , cela peut être _ ou - ou . , et donc pas forcement " $1 " , d'ou ma difficulté ...
    Dans ce cas, il suffit d'adapter l'expression régulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $num = $1 if $fic =~ /[-_.](\d+)[-_.]/;
    Et ça devrait rester $1.

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Il y aurait beaucoup d'améliorations à apporter à ton script.

    D'abord, ajoute un:
    au début et corrige toutes les erreurs que ça fait apparaître (essentiellement ajouter des déclarations de variables, mais aussi certainement quelques autres).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sub recherche_trous ($$@) {
    N'utilise pas de prototypes à moins de vraiment bien comprendre ce qu'ils font. Contente-toi de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sub recherche_trous {
    Puis quelques points relevés rapidement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for ( $a=1 ; $a < $_[0] ; $a++) {
    Il est plus idiomatique et plus perlien d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for my $a (1..$_[0]-1) {
    (cette syntaxe vient plusieurs fois, par exemple "for ( $i=0; $i<$fin; $i++) {", je ne cite qu'une seule fois).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($decalage == undef ) { $decalage = 0; }
    Ceci serait meilleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $decalage = 0 unless defined $decalage;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $erreur = $erreur . " * Le fichier...";
    s'écrit plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $erreur .=  " * Le fichier...";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    open (FIC, $fich_config) or die ($erreur);
    my @fic = <FIC>;
    Il vaut mieux écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    open my $FIC, "<", $fich_config or die "Ouverture impossible de $fich_config $!";
    my @fic = <$FIC>;
    Trois points: utilisation d'un filehandle lexical, utilisation d'une syntaxe à trois arguments (avec indication du mode d'ouverture) et utilisation de la variable $! qui indique l'erreur rapportée par le système (ça peut être autre chose que le fichier manquant).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my @fic = <FIC>;
    foreach my $line (@fic) {
    	@trans = split (/;/, $line );
    	#print $trans[0]."-".$EEC."\n";
    	if ( $trans[0] eq $EEC ) {
    		$type_date = $trans[1];
    		$position = $trans[2];
    		$debut_date = $trans[3];
    		$fin_date = $trans[4];
    		# ...
    J'écrirais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (my $line = <$FIC>) {
        my @trans = split /;/, $line;
        if ( $trans[0] eq $EEC ) {
            my ($type_date, $position, $debut_date, $fin_date, ...) = @trans;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $JJ=substr ($Date,0,2);
    $MM=substr ($Date,3,2);
    $AA=substr ($Date,8,2);
    $BB=substr ($Date,6,4);
    Peut-être plus concis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($jj, $mm, $bb, $aa) = $Date =~ /(\d\d).(\d\d). .../;
    Mais l’utilisation de la fonction split serait sans doute encore meilleure, mais je ne précise pas, ne connaissant pas la valeur de ton (tes?) séparateurs.

    Bon, il y aurait bien d'autres remarques, mais je m'arrête là pour le moment, inutile que je perde mon temps si mes corrections ne t'intéressent pas.

    A mon avis, ton code est au moins deux fois plus long que nécessaire, et je ne parle que de syntaxe; l'algo devrait aussi pouvoir être plus simple, mais je n'ai pas le courage de regarder cela maintenant.

  10. #10
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Détrompes toi , tes corrections intéressent grandement , je ne fais du Perl que depuis 1 mois , et sans formation ( prévue en juillet) donc je prends toutes tes remarques , même si j'ai encore un peu de mal avec certaines , et je me doute bien qu'il y à beaucoup de choses à améliorer ...

    Mais avec de la patience ...

  11. #11
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Il y aurait beaucoup d'améliorations à apporter à ton script.

    D'abord, ajoute un:
    au début et corrige toutes les erreurs que ça fait apparaître (essentiellement ajouter des déclarations de variables, mais aussi certainement quelques autres).
    -> J'ai tellement de variables , et j'en ai rajouté au fur et à mesure des besoins , dois-je le déclarer toutes en debut de scripts ?

    Citation Envoyé par Lolo78 Voir le message
    Il y aurait beaucoup d'améliorations à apporter à ton script.

    Puis quelques points relevés rapidement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for ( $a=1 ; $a < $_[0] ; $a++) {
    Il est plus idiomatique et plus perlien d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for my $a (1..$_[0]-1) {
    (cette syntaxe vient plusieurs fois, par exemple "for ( $i=0; $i<$fin; $i++) {", je ne cite qu'une seule fois).
    Heu , ne comprenant pas trop pour l'instant je prefère conserver pour l'instant "for ( $i=0; $i<$fin; $i++)" , mais j'y reviendrai certainement ...

    J'ai reprit tes conseils pour le reste et modifie mon code en conséquence ...
    Merci en tout cas de t'être attardé dessus

  12. #12
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    -> J'ai tellement de variables , et j'en ai rajouté au fur et à mesure des besoins , dois-je le déclarer toutes en debut de scripts ?
    Si tu parles de la déclaration des variables, alors non, il est préférable de ne pas les déclarer en début de scripts (tu en ferais des variables globales ou presque), mais de les déclarer là où tu en as besoin, dans le plus petite portée lexicale possible. Par exemple, une variable utilisée uniquement dans une fonction doit de préférence être locale à cette fonction et donc déclarée dans la fonction. Si c'est une variable de boucle, ne la déclarer qu'au début de la boucle, pas avant. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (my $line = <$FH>) {
        # utiliser la variable $line
        # ...
    }
    Ici, $line est déclarée à l'entrée de la boucle, elle n'est accessible que jusqu'à l'accolade fermant la boucle. Cela te protège contre d'éventuels problèmes si tu as une autre variable ayant le même nom ailleurs, par exemple dans une autre boucle ou dans une fonction. Il y aurait des risques de collision si $line était déclarée au début du programme.

  13. #13
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    J'écrirais plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (my $line = <$FIC>) {
        my @trans = split /;/, $line;
        if ( $trans[0] eq $EEC ) {
            my ($type_date, $position, $debut_date, $fin_date, ...) = @trans;

    ça ne marche pas pour moi , même si j'aurai préféré le contraire car plus concis ...

    Concernant les variables , me voilà rassuré par tes explications

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    ça ne marche pas pour moi , même si j'aurai préféré le contraire car plus concis ...
    Bien sûr que ça marche. Il faut naturellement remplacer les "..." par le reste des variables.

    Mais ça marche, ou ça doit marcher. J'utilise cette syntaxe pratiquement chaque jour.

    Ou alors, montre-nous le code qui ne marche pas et dis-nous ce qui ne marche pas: as-tu un avertissement ou un message d'erreur? ou ça ne fait pas ce que tu attends? Dans ce dernier cas, précise ce que tu attends et ce que tu obtiens de différent.

  15. #15
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bien sûr que ça marche. Il faut naturellement remplacer les "..." par le reste des variables.
    Oui , bien évidement mais ... bref j'ai remit le code tel qu'ils était au départ pour ce point précis.

    Après plusieurs modifs et améliorations mon script "tourne" parfaitement , mis a part pour le point qui m'a amené ici , mais après avoir retourner le problème dans tous les sens , impossible de gérer le cas qui me concerne.

    Etant donné que c'est un cas très particulier (1/1000) j'en reste là

    Merci à Lolo78 pour ses précieux conseils !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/07/2011, 15h38
  2. Réponses: 7
    Dernier message: 19/09/2004, 22h01
  3. Liste de fichiers et de répertoires
    Par Freakazoid dans le forum C++
    Réponses: 4
    Dernier message: 09/08/2004, 17h16
  4. liste des fichiers d'un répertoire
    Par am dans le forum C
    Réponses: 3
    Dernier message: 04/08/2003, 17h03
  5. [Kylix] Liste des fichiers d'un répertoire
    Par Houben Jacques dans le forum EDI
    Réponses: 3
    Dernier message: 30/11/2002, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo