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 :

Les tableaux multidimentionnels pas trés clairs


Sujet :

Langage Perl

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Les tableaux multidimentionnels pas trés clairs
    Bonjour,

    voici mon problème,

    le veux lire 2 répertoires et comparait leur contenu via des tableaux en Perl.
    Qu'en je parle de comparaison du contenu j'entends liste les fichiers présent selon une wildcard (j'ai le scrpit perl pour)
    quantifier la taille du fichier en octet ou ko ( je passe par une fonction unix ou peux être existe til un commande perl?)

    Quantifier le fichier en nombre de ligne (j'ai mon script Perl).

    Je veux donc créer 2 tableaux multidimensionnelles donc chaque ligne contiendrait
    nomfichier , taille octet, nb ligne.

    Tous les exemples que je trouve de tableaux multidimensionnelle par du postulas que le contenu global de celui-ci est connu d'avance

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/perl
    @famille = (["Pierre",12],["Paul",10],["Jean",9],["Jacques",5],["Kringer",2]);
    for $i (0..4) {
    print $famille[$i][0]."
    mais - je n'ai pas trouver d'exemple précis de tableaux avec un contenu inconnu que l'on renseigner par du
    .
    un tableau de tableau en quelque sorte . ou le second tableau serait une liste contenant les informations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomfichier , taille octet, nb ligne.

    et je n'ai trouve que des exemples d'affichage des données , uniquement du

    Si quelqu'un a un exemple . merci.

    PS l'idée de passé par un object why not mais mes confrères ne sont pas chaud . de plus la version de Perl utilisé etant le 5.8.8 (pas d'évolution possible) peut-elle supporte le poo????

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Perl 5.8 supporte la POO, mais il n'y pas de raison d'uiliser la POO pour un problème de ce type.

    Pour ajouter des valeurs dans un tableau à deux dimensions, tu peux faire ceci:
    [/CODE][/CODE]
    push @famille, [$nom, $age];
    [/CODE]

    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    push @tableau, [$nom_fic, $taille_fic, $nb-lignes]
    Mais, d'après ta description de tes objectifs, je ne pense pas qu'un tableau de tableaux (ou tableau bidimensionnel) soit la bonne structure de données.

    Je pense que tu veux plutôt un hachage de hachages, une structure du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ( nom_fic1 => { taille => "la taille1", lignes => "le nombre de lignes 1"},
      nom_fic2 => { taille => "la taille2", lignes => "le nombre de lignes 2"},
      # ...
    )
    C'est ensuite bien plus simple d'accéder aux données.

    Dis nous si tu veux de l'aide pour construire ce genre de structure.

  3. #3
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut A la suite
    =Lolo78;8578245]Perl 5.8 supporte la POO, mais il n'y pas de raison d’utiliser la POO pour un problème de ce type.

    .
    Oui peut-être sauf que je pourrais peut être en avoir besoin dans d'autres cas.
    Mais comment savoir qu''un AIX à ou n' pas tous les modules de Perl souhaité
    .
    est-ce que le POO est natif. Suppose t'il des modules particulier de www.cpan.org/modules/

    J'ai cherche une commande me permettant de les liste , il n'y a pas grand chose.

    Donc si je comprend bien voici ce que cela pourrais donner

    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
    #! perl
    use strict; 
    use warnings; 
     
    # variable global
    my @fichier_1 =recupere_liste($repertoire1); # cette partie est fonctionnel ne pas prêter attention à la non existence des variables, fonction et de leur contenu
    my @fichier_1 =recupere_liste($repertoire1);
    my $cpt_1  =  0 ;
    my $cpt_2  =  0 ;
     
     
    sub compteurdeligne_fichier  {
    # initialisation des variables
    	my $fichier = $_[0];            # Le nom du fichier "Premier paramètre $_[0]\n";
    	my $cpt  = '0';                      # le compteur lui-même
     
     
    	open(my $FIchierlu, $fichier)    # ouverture du fichier
    	 or die "Impossible d'ouvrir $fichier: $!";
    	 $cpt++ while <$FIchierlu>; # bloucle de lecteur simplifié
     
    	 close ($FIchierlu);                  # fermeture du fichier
    	 return $cpt;
    }
     
       foreach my $name ( @fichier_1 ) {
           $name =>{ taille => ma_tailllefic($name ) , lignes => compteurdeligne_fichier ($name ); # hachage
        push @tableaufic1, [ $name , ma_tailllefic($name ),  compteurdeligne_fichier($name )] ; # tabelau
      }
    ......
     
       foreach my $name ( @fichier_2 ) {
           $name =>{ taille => ma_tailllefic($name ) , lignes => compteurdeligne_fichier ($name ); # hachage
        push @tableaufic1, [ $name , ma_tailllefic($name ),  compteurdeligne_fichier($name )] ; # tabelau
      }
    me reste comprendre la lecteur, les tri des ces deux processus..

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    La POO est native et sera forcément disponible en version 5.8. Du moins la POO de base.

    Il existe des versions plus récentes et plus avancées de POO Moose, Moo, etc.) , qui sont implémentées par des modules. Cela ne seront sans doute pas disponibles et ne seront sans doute pas compatibles avec la version 5.8.

    Pour ton problème de fichiers, je reviendrai avec un exemple plus tard.

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut le code
    voici le début du 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    use strict; 
    use warnings; 
    #strict et warnings : sont deux modules internes à Perl permettant de vérifier la syntaxe de votre code et de vous alerter à la compilation du programme ;
    #require "\\Fonctions\\FonctionFichiers.pl";
    require "./Fonctions/FonctionFichiers.pl";
     
    # Afin de mettre en évidence ce type de problème, nous pouvons forcer la déclaration de chaque variable avant son utilisation en faisant appel au module « strict » par l'insertion après la première ligne du script de l'instruction 'use strict'.
     
    # variable global
    my $fichier_1 = $ARGV[0];
    my $fichier_2 = $ARGV[1];
    my $cpt =  0 ;
     
    my $header_fic_log = "Nomfichier;Nombre d'enregistrement F1";
     
     
    # debut code    
    # doit contenir : nom du fichier + longueur. 
     
    print " $ARGV[0] \n";   
    print " $ARGV[1] \n";  
     
    # liste les fichiers *.dat des répertoire
    my @T_fic1 = listedesfichiers( $ARGV[0], '*.dat' );
    my @T_fic2 = listedesfichiers( $ARGV[1], '*.dat' );
     
    print  @T_fic1;
    print "- \n \n";
    print  @T_fic2;
     
     
     
      foreach my $name ( @T_fic1) {
       	print "$name\n";	
       	$cpt  = compteurdeligne_fichier($name);  
    	print "comp =$cpt \n";
       }     
     
    	    foreach my $name ( @T_fic2) {
       	print "$name \n";	
       	$cpt  = compteurdeligne_fichier($name);  
    	print "comp =$cpt \n";
       }

    le contenu du requis


    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
     
    sub listedesfichiers{
    	chdir($_[0]); # positionnement sur le repertoire
     	print "$_[0] \n ";
    	my @T_FIC = glob($_[1]);	
    	return  @T_FIC; 
    }
     
    # compteur de nombre de ligne d'un fichier
     sub compteurdeligne_fichier {
     	my $fichier = $_[0];            # Le nom du fichier "Premier paramètre $_[0]\n";
     	my $cpt  = '0';                      # le compteur lui-même
     	open(my $FIchierlu, $fichier)	 or die "Impossible d'ouvrir $fichier: $!";
     	 $cpt++ while <$FIchierlu>; # bloucle de lecteur simplifié
     	 close ($FIchierlu);                  # fermeture du fichier
     	 return $cpt;
     }    
    1; #cloture de valeur par defaut	lié à l'erreur Did not return a true value at

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl lirefic.pl ./dev/SIM/R/20160220041004_RFNPN615-S7690835-GTW-1047049-20160220041001 ./dev/SIM/R/20160220080706_AM024-169631-20160220080520
    la commande shell lancer sous cigwin poste windos

    le résultat qui me laisse interrogatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ./dev/SIM/R/20160220041004_RFNPN615-S7690835-GTW-1047049-20160220041001
     ./dev/SIM/R/20160220080706_AM024-169631-20160220080520
    ./dev/SIM/R/20160220041004_RFNPN615-S7690835-GTW-1047049-20160220041001
     ./dev/SIM/R/20160220080706_AM024-169631-20160220080520
     R_1.dat-
     
    R_1.datR_1.dat
    comp =2505
    R_1.dat
    comp =2505

    alors que le paramètre N°2 contient bien l'information correcte , pourquoi l'appel de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @T_fic2 = listedesfichiers( $ARGV[1], '*.dat' );
    retourne t'il le résultat précédent? comme si le nouvel argument passer dans cette appel de fonction n'était prise en compte ?

    une fonction perl qui ne retourne que la première valeur ??? Même le print affichant la valeur du paramètre reçu dans la fonction ne change pas au 2 ime passage....???

  6. #6
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonsoir,


    voici un exemple de code qui lit certains fichiers de mon répertoire par défaut (t*.pl), calcule la taille et le nombre de lignes et stocke tout ça dans un hachage de hachages:
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %files_hash;
     
    for my $file (glob "./t*.pl") {
    	my $size = -s $file;
    	my $wc = `wc -l $file`;  # NB: j'utilise ici la fonction unix wc par paresse; dans la réalité, je lirais sans doute chaque fichier en Perl
    	my $line_count = (split / /, $wc)[0];
    	$files_hash{$file} = { taille => $size, lignes => $line_count};
    }
     
    print Dumper \%files_hash;
    Ce qui affiche la structure de données résultat suivante:
    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
     
    $VAR1 = {
              'test1.pl' => {
                              'lignes' => '27',
                              'taille' => 1004
                            },
              'test_utf8.pl' => {
                                  'lignes' => '45',
                                  'taille' => 989
                                },
              'transpose.pl' => {
                                  'lignes' => '19',
                                  'taille' => 349
                                },
              'test_sub.pl' => {
                                 'lignes' => '14',
                                 'taille' => 244
                               },
              'test_argv.pl' => {
                                  'lignes' => '13',
                                  'taille' => 231
                                },
              'test_debug.pl' => {
                                   'lignes' => '12',
                                   'taille' => 141
                                 },
              'translate.pl' => {
                                  'lignes' => '37',
                                  'taille' => 1408
                                },
     
    [...]
     
              'teams.pl' => {
                              'lignes' => '44',
                              'taille' => 1003
                            },
              'test_debug_warn.pl' => {
                                        'lignes' => '26',
                                        'taille' => 485
                                      }
            };
    Pour connaître les caractéristiques du fichier teams.pl, il me suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $line_count = $files_hash{"teams.pl"}{lignes};
    my $taille = $files_hash{"teams.pl"}{taille};
    Il est donc très facile, si je lis un second répertoire, de comparer avec ce que j'avais dans le premier répertoire.

  7. #7
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Datadum
    A quoi sert
    t*.pl il s'agit de tous les fichiers avec comme wildcard t*.pl j'ai un peu de mal avec la je ne vois pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $wc = `wc -l $file`;
     
    my $line_count = (split / /, $wc)[0];
    Dans le tuto j'ai vue ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     liste = split( / séparateur /, chaîne );
    par contre sur ton exemple j'ai plus de mal.

    $sw pour un fichier donnée le nombre de ligne un séparateur le nom du fichier
    Docn si je comprend bien, le split sépare et tu récupères le premier éléments de liste ainsi généré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    wc -l <nom_du_fichier> # affiche le nombre de lignes
    wc -c <nom_du_fichier> # affiche le nombre de bytes
    wc -m <nom_du_fichier> # affiche le nombre de caractères
    wc -L <nom_du_fichier> # indique la longueur de la plus longue ligne
    wc -w <nom_du_fichier> # affiche le nombre de mots

    Celui-ci aussi demande une explication

    merci pour cette exemple

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    A quoi sert
    Uniquement à l'affichage visuel de la structure de données à la fin (ligne print Dumper ...).

    Citation Envoyé par dedalios Voir le message
    t*.pl il s'agit de tous les fichiers avec comme wildcard t*.pl j'ai un peu de mal avec la je ne vois pas
    Sous Unix (ou Cygwin), ./ représente le répertoire courant En fait, ça ne sert à rien ici, sinon à dire explicitement que j'ai choisi de parcourir le répertoire courant.

    Citation Envoyé par dedalios Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $wc = `wc -l $file`;
     
    my $line_count = (split / /, $wc)[0];
    Dans le tuto j'ai vue ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     liste = split( / séparateur /, chaîne );
    par contre sur ton exemple j'ai plus de mal.

    $sw pour un fichier donnée le nombre de ligne un séparateur le nom du fichier
    Docn si je comprend bien, le split sépare et tu récupères le premier éléments de liste ainsi généré.
    Oui, exactement, "wc -l test_utf8.pl" génère une ligne du genre "45 test_utf8.pl", le (split ... )[0] me permet de récupérer le premier champ. Autrement dit, je récupère le nombre de lignes calculé par wc.

    Mais, comme je l'ai dit, j'ai fait ça par paresse. Dans un vrai programme, j'ouvrirais le fichier avec open et compterais les lignes.

    Citation Envoyé par dedalios Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    wc -l <nom_du_fichier> # affiche le nombre de lignes
    wc -c <nom_du_fichier> # affiche le nombre de bytes
    wc -m <nom_du_fichier> # affiche le nombre de caractères
    wc -L <nom_du_fichier> # indique la longueur de la plus longue ligne
    wc -w <nom_du_fichier> # affiche le nombre de mots

    Celui-ci aussi demande une explication

    merci pour cette exemple
    Bah, il n'y a pas grand chose à en dire, ce n'est pas du Perl, c'est une commande système Unix. Tu travailles sous Cygwin, je supposais que tu connaissais les commandes système de base de Cygwin /Unix / Linux / bash.

    Ici, on cherche le nombre de ligne du fichier, j'utilise donc "wc -l" pour récupérer le nombre de lignes. Essaie "wc -l" sur un nom de fichier sous bash, tu verras ce que ça donne.

    Joyeuses Pâques.

  9. #9
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut resultat qui reste a améliorer sur un point
    les fonctions

    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
    sub listedesfichiers{
     	# print "lecteur du repertoire $_[0] \n ";
    	$pathfichier="$_[0]/$_[1]";
    	# print ("wildcard :$pathfichier \n ");
    	chdir($pathfichier); # positionnement sur le repertoire
    	my @T_FIC = glob($pathfichier);	
    	return  @T_FIC; 
    }
     
    # compteur de nombre de ligne d'un fichier
     sub compteurdeligne_fichier {
     	my $fichier = $_[0];            # Le nom du fichier "Premier paramètre $_[0]\n";
     	my $cpt  = '0';                      # le compteur lui-même
     	open(my $FIchierlu, $fichier)	 or die "Impossible d'ouvrir $fichier: $!";
     	$cpt++ while <$FIchierlu>; # bloucle de lecteur simplifié
     	close ($FIchierlu);                  # fermeture du fichier
     	return $cpt;
     }    
    1; #cloture de valeur par defaut	lié à l'erreur Did not return a true value at

    le programme
    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
     
    #!/usr/bin/perl
    use strict; 
    use warnings; 
    use Data::Dumper;
     
     
    #strict et warnings : sont deux modules internes à Perl permettant de vérifier la syntaxe de votre code et de vous alerter à la compilation du programme ;
    #require "\\Fonctions\\FonctionFichiers.pl";
    require "./Fonctions/FonctionFichiers.pl";
     
    # Afin de mettre en évidence ce type de problème, nous pouvons forcer la déclaration de chaque variable avant son utilisation en faisant appel au module « strict » par l'insertion après la première ligne du script de l'instruction 'use strict'.
     
    # variable global
    my $fichier_1 = $ARGV[0];
    my $fichier_2 = $ARGV[1];
     
    my @T_fic1=undef;
    my @T_fic2=undef;
    my %files_hash_1;
    my %files_hash_2;
     
     
    my $header_fic_log = "Nomfichier;Nombre d'enregistrement F1";
     
     
    # debut code    
    # doit contenir : nom du fichier + longueur. 
     
    # print " $ARGV[0] \n";   
    # print " $ARGV[1] \n";  
     
    # liste les fichiers *.dat des répertoire
    # print "Appel aux fonctions \n";  
    @T_fic1 = listedesfichiers( $ARGV[0], '*.dat' );
    @T_fic2 = listedesfichiers( $ARGV[1], '*.dat' ); 
     
    ######################
    # MAIN               #
    ######################
    # print  ("@T_fic1 \n ");
    # print  ("@T_fic2 \n ");
     
     
      foreach my $name ( @T_fic1) {
    #   	print "$name\n";	
    	my $line_count =  0 ;
       	$line_count = compteurdeligne_fichier($name);  
    #	print "comp =$line_count \n";
     	$files_hash_1{$name} = { taille => "1", lignes => $line_count };
    }
     
    print Dumper \%files_hash_1;
     
        foreach my $name ( @T_fic2) {
    #   	print "$name \n";
    	my $line_count=  0 ;
       	$line_count = compteurdeligne_fichier($name);  
    #	print "comp =$line_count \n";
     	$files_hash_2{$name} = { taille => "1", lignes => $line_count };
       }      
    print Dumper \%files_hash_2;	
     
     
    # comptages enregitrement fichier r  
     
    # open( my $fichierlog,'+>','Resultat1.log') or die("open: $!");    
    # print($fichierlog "$header_fic_log \n");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    #  foreach my $name ( @T_fic1) {
    #    	print "$name\n";	
    #    	$cpt  = compteurdeligne_fichier($name);  
    #	print "comp =$cpt";
    #    	print ("$fichierlog;$name;$cpt");
    #   }    
    # close($fichierlog);	  
    #   
     
     
     
     exit;
    me reste a reutiliser wc -l pour la taille des fichiers.

    et plus qu'a tester.

  10. #10
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message

    me reste a reutiliser wc -l pour la taille des fichiers.
    Inutile, puisque tu as déjà la fonction compteurdeligne_fichier() qui effectue le décompte des lignes.

    Et pour la taille en octets, elle est donnée dans mon code par la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $size = -s $file;

  11. #11
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Inutile, puisque tu as déjà la fonction compteurdeligne_fichier() qui effectue le décompte des lignes.

    Et pour la taille en octets, elle est donnée dans mon code par la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $size = -s $file;

    merci c'est aussi ce que j'ai utilisé à la lecture du premier exemple.
    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
     
      foreach my $name ( @T_fic1) {
        	print "$name\n";	
    	my $line_count =  0 ;
       	$line_count = compteurdeligne_fichier($name);  
    #	print "comp =$line_count \n";
     	my $taillefic  = -s $name;
    	my $valeur = "//";
    	my @typefic =  split(/ $valeur /,$name);
    		 foreach my $nn2 ( @typefic) {
    		 print ("$nn2 /n");
    		 }
    	print $typefic;
     
     
    #	$files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "false",fictype => $typefic};
    #	$files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "faux" };
    }


    Avec cette partie de code je cherche a découper la chaine "./dev/SIM/R/20160115221500Avide/R_NOEMATI_20160115221500_Tst_20160303154551.dat" pour en extraire le nom du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      foreach my $name ( @T_fic1) {
        	print "$name\n";	
    	my $line_count =  0 ;
       	$line_count = compteurdeligne_fichier($name);  
    #	print "comp =$line_count \n";
     	my $taillefic  = -s $name;
    	my $valeur = "/";
    	my @typefic =  split(/${valeur}/,$name);
    		 foreach my $nn2 ( @typefic) {
    		 print ("$nn2 /n");
    		 }
    	print $typefic;
    mais rien ne sort du print le fait de doubler le caractères spéciale ne semble rien changer.

    est pourtant ceci fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        my $test = "./dev/SIM/R/20160115221500Avide/R_NOEMATI_20160115221500_Tst_20160303154551.dat";
    	my $valeur = "/";
    	my @typefic =  split(/${valeur}/,$test);
     	foreach my $nn2 ( @typefic) {
    	 print ("$nn2 \n");
    	}
    	print $typefic;

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Hum, ça devrait pour tant marcher (même si ce n'est peut-être pas la meilleure de faire).

    Peux-tu: 1. afficher la valeur de $name juste avant le split; 2. imprimer @typefic (entre guillemets) juste après le split; 3. poster les résultats ici.

    Bonne soirée,
    Laurent.

  13. #13
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Cela marche parfaitement quand on lance le code modifier et non comme précédemment une copie faire la veille...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      foreach my $name ( @T_fic1) {
        print "$name\n";	
    	my $line_count =  0 ;
       	$line_count = compteurdeligne_fichier($name);  
    #	print "comp =$line_count \n";
     	my $taillefic  = -s $name;
    	my $valeur = "/";
    	my @typefic =  split(/${valeur}/,$name);
    		 foreach my $nn2 ( @typefic) {
    		 print ("$nn2 \n");
    		 }
    	print @typefic;
     	$files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "faux" };
    }
    Ceci fait le reste à comprendre comme lire les valeurs insérer dans la table de hachage afin de les trier
    Comme récupéré la derniere valeur de la liste @typefic

  14. #14
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Etrange réaction d'un lliste
    soit la fonction



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub Nomfic { 
     	my @RT_FIC ="";
     	my $valeur = "/";
     	# print ("$_[0] §/n");
    	my @T_FIC  =  split(/${valeur}/,$_[0]); # décooupe le nom long selon le caractères /
        my $nom_fichier = $T_FIC[$#T_FIC]; # L’indice du dernier element d’une variable tableau est accessible par la variable scalaire $#nom-du-tableau.
    	my $nom_repertoire =$T_FIC[$#T_FIC -1];
    #	print ("nom_fichier = $nom_fichier \n");
    #	print ("nom_repertoire= $nom_repertoire \n");
    	push(@RT_FIC,$nom_fichier,$nom_repertoire);
    #  print ("return = @RT_FIC \n");
      return  @RT_FIC;
     
     	}
    j'appelle cette fonction avec comme paramètre ./dev/SIM/R/201600101-GTW-Aso/Toto.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     		my @deffic =Nomfic("./dev/SIM/R/201600101-GTW-Aso/Toto.txt");
    	 	print (" @deffic  \n");
    	 	print (" $deffic[0]  \n");
    	 	print (" $deffic[1]  ---  \n");
    le premier print me renvoi "Toto.txt 201600101-GTW-Aso"
    le deuxième print renvoi Toto.txt
    et en suite sans le saut de ligne j'ai ----.
    L'indice de la liste @deffic va bien de 0 à 1 ?

    Donc pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	print (" $deffic[1]  ---  \n");
    ne retourne pas 201600101-GTW-Aso


    Autre chose comme voyage t'on dans la table de hasg genere (comme passe t'on d'incide en indice (
    $files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "false",fictype => $typefic};

  15. #15
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    le lanceur perl lirefic.pl ./dev/SIM/R/21 ./dev/SIM/R/21

    le code MAin

    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
     
    use strict; 
    use warnings; 
    use Data::Dumper;
     
     
    #strict et warnings : sont deux modules internes à Perl permettant de vérifier la syntaxe de votre code et de vous alerter à la compilation du programme ;
    require "./Fonctions/FonctionFichiers.pl";
     
    # Afin de mettre en évidence ce type de problème, nous pouvons forcer la déclaration de chaque variable avant son utilisation en faisant appel au module « strict » par l'insertion après la première ligne du script de l'instruction 'use strict'.
     
     
     
    Ce cas marche avec e lanceur perl lirefic.pl ./dev/SIM/R/21 ./dev/SIM/R/21 (en ajoutant un espace après le second paramètre?
     
    Quid de cette espace? why pourquoi ce problème?
     
     
    # variable global
    my $fichier_1 = $ARGV[0];
    my $fichier_2 = $ARGV[1];
     
    my @T_fic1=undef;
    my @T_fic2=undef;
    my %files_hash_1;
    my %files_hash_2;
     
     
    my $header_fic_log = "Nomfichier;Nombre d'enregistrement F1";
     
     
    # debut code    
    # doit contenir : nom du fichier + longueur. 
    # print " $ARGV[0] \n";   
    # print " $ARGV[1] \n";  
     
    # liste les fichiers *.dat des répertoire
    # print "Appel aux fonctions \n";  
    @T_fic1 = listedesfichiers( $ARGV[0], '*.dat' );
    push( @T_fic1,listedesfichiers( $ARGV[0], '*.err' ));
     
    @T_fic2 = listedesfichiers( $ARGV[1], '*.dat' ); 
    push( @T_fic2,listedesfichiers( $ARGV[1], '*.err' ));
     
     
    ######################
    # MAIN               #
    ######################
     
    #debug mode
    #  print  ("@T_fic1 \n ");
    #  print  ("@T_fic2 \n ");
     
      foreach my $name ( @T_fic1) {
      #debug mode
       #  print "$name\n";	
        my $line_count =  0 ;
      	$line_count = compteurdeligne_fichier($name);  
      	#print ("comp = $line_count \n");
     		my $taillefic  = -s $name;
     		my @deffic =Nomfic( $name);
    	 #	print (" @deffic  \n");
     
    	$files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "faux", nomfic => $deffic[1]  , nomrep => $deffic[2] };
    }
     print Dumper \%files_hash_1;
     
     
       foreach my $name ( @T_fic2) {
      #debug mode
        print "$name\n";	
        my $line_count =  0 ;
      	$line_count = compteurdeligne_fichier($name);  
      	#print ("comp = $line_count \n");
     	my $taillefic  = -s $name;
     	my @deffic =Nomfic( $name);
    	 #	print (" @deffic  \n");
    	$files_hash_2{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "faux", nomfic => $deffic[1]  , nomrep => $deffic[2] };
    }
     print Dumper \%files_hash_2;
     
     
    # comptages enregitrement fichier r  
     
    # open( my $fichierlog,'+>','Resultat1.log') or die("open: $!");    
    # print($fichierlog "$header_fic_log \n");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    #  foreach my $name ( @T_fic1) {
    #    	print "$name\n";	
    #    	$cpt  = compteurdeligne_fichier($name);  
    #	print "comp =$cpt";
    #    	print ("$fichierlog;$name;$cpt");
    #   }    
    # close($fichierlog);	  
    #   
     
     
     
     exit;

    Les fonctions



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Liste les fichiers présent dans le repertoire en paramêtres.  
    sub listedesfichiers{
    	$pathfichier="$_[0]/$_[1]";
     # debug mode
     # print "Wildcard $pathfichier \n";
    	chdir($pathfichier); # positionnement sur le repertoire
     # debug mode
    	my @RT_FIC = glob($pathfichier);	
    # debug mode
    # 	print " @RT_FIC \n";
    	return  @RT_FIC; 
    }



    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
    # Compteur de nombre de ligne d'un fichier                                         
     sub compteurdeligne_fichier {  
     		my $RT_cpt  = '0';                      # le compteur lui-même       
     	 	#debug mode 
     	#	print(" compteurdeligne_fichier \n" );      
     	#	print(" fichierlu : \n");      
     	#	print("$_[0] \n");     
     	 	open(my $FIchierlu, $_[0])	 or die "Impossible d'ouvrir $fichier: $!";        
     		$RT_cpt++ while <$FIchierlu>; # bloucle de lecteur simplifié                       
     		close ($FIchierlu);        # fermeture du fichier     
     	#	print (" compteur = $RT_cpt \n");                
     		return $RT_cpt;                                                                    
     }       
     
     
     sub Nomfic { 
     	my @RT_FIC ="";
     	my $valeur = "/";
     	# print ("$_[0] §/n");
    	my @T_FIC  =  split(/${valeur}/,$_[0]); # décooupe le nom long selon le caractères /
        my $nom_fichier = $T_FIC[$#T_FIC]; # L’indice du dernier element d’une variable tableau est accessible par la variable scalaire $#nom-du-tableau.
    	my $nom_repertoire =$T_FIC[$#T_FIC -1];
    #	print ("nom_fichier = $nom_fichier \n");
    #	print ("nom_repertoire= $nom_repertoire \n");
    	push(@RT_FIC,$nom_fichier,$nom_repertoire);
    #  print ("return = @RT_FIC \n");
      return  @RT_FIC;
     
     	}                                                  
     
     1; #cloture de valeur par defaut	lié à l'erreur Did not return a true value at

    Le premier paramètrage me retourne l'intégralité des informations (liste des fichier *.dat *.err , taille nom ....)
    quand au deuxième paramètre du lanceur

    print Dumper \%files_hash_2;

    Je n'ai que le nom du répertoire en lieu est place des fichiers (hors il s'agit pourtant du même répertoire ?

    curieusement la fonction qui recherche le contenu du repertoire si j'active le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Wildcard $pathfichier \n";
    dans ce deuxième cas ne me retourne que le nom du répertoire comme s'il ne prenais pas le paramètre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @T_fic2 = listedesfichiers( $ARGV[1], '*.dat' ); 
    push( @T_fic2,listedesfichiers( $ARGV[1], '*.err' ));
    comme si le paramètre N°2 ici n’était pas prise en compte totalement?


    Autres question comme puis-je lire ces tables de hash , comment accéder au nième enregistrement?
    toutes les exemples de tableau de hash part du postulat que le nombre de ligne du tableau est connu.

  16. #16
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    soit la fonction



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub Nomfic { 
     	my @RT_FIC ="";
     	my $valeur = "/";
     	# print ("$_[0] §/n");
    	my @T_FIC  =  split(/${valeur}/,$_[0]); # décooupe le nom long selon le caractères /
        my $nom_fichier = $T_FIC[$#T_FIC]; # L’indice du dernier element d’une variable tableau est accessible par la variable scalaire $#nom-du-tableau.
    	my $nom_repertoire =$T_FIC[$#T_FIC -1];
    #	print ("nom_fichier = $nom_fichier \n");
    #	print ("nom_repertoire= $nom_repertoire \n");
    	push(@RT_FIC,$nom_fichier,$nom_repertoire);
    #  print ("return = @RT_FIC \n");
      return  @RT_FIC;
     
     	}
    j'appelle cette fonction avec comme paramètre ./dev/SIM/R/201600101-GTW-Aso/Toto.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     		my @deffic =Nomfic("./dev/SIM/R/201600101-GTW-Aso/Toto.txt");
    	 	print (" @deffic  \n");
    	 	print (" $deffic[0]  \n");
    	 	print (" $deffic[1]  ---  \n");
    le premier print me renvoi "Toto.txt 201600101-GTW-Aso"
    le deuxième print renvoi Toto.txt
    et en suite sans le saut de ligne j'ai ----.
    L'indice de la liste @deffic va bien de 0 à 1 ?

    Donc pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	print (" $deffic[1]  ---  \n");
    ne retourne pas 201600101-GTW-Aso
    En simulant ton code sous le debugger, ça marche parfaitement pour moi:

    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
     
     
      DB<1> $in = './dev/SIM/R/201600101-GTW-Aso/Toto.txt';
     
      DB<2>  $valeur = "/";
     
      DB<3> @T_FIC  =  split(/${valeur}/, $in);
     
      DB<4>  x \@T_FIC
    0  ARRAY(0x600500cf8)
       0  '.'
       1  'dev'
       2  'SIM'
       3  'R'
       4  '201600101-GTW-Aso'
       5  'Toto.txt'
      DB<5> $nom_fichier = $T_FIC[$#T_FIC];
     
      DB<6> $nom_repertoire =$T_FIC[$#T_FIC -1];
     
      DB<7> push(@RT_FIC,$nom_fichier,$nom_repertoire);
     
      DB<8> x \@RT_FIC;
    0  ARRAY(0x600622728)
       0  'Toto.txt'
       1  '201600101-GTW-Aso'
      DB<9> @deffic = @RT_FIC; # silumation du return
     
      DB<10> print (" @deffic  \n");
     Toto.txt 201600101-GTW-Aso
     
      DB<11> print (" $deffic[0]  \n");
     Toto.txt
     
      DB<12> print (" $deffic[1]  ---  \n");
     201600101-GTW-Aso  ---
    Citation Envoyé par dedalios Voir le message

    Autre chose comme voyage t'on dans la table de hasg genere (comme passe t'on d'incide en indice (
    $files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "false",fictype => $typefic};
    Ce ne sont pas des indices mais des clés.

    Pour obtenir la taille et le nombre de lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $taille = $files_hash_1{$name}{taille};
    my $nb-lignes = $files_hash_1{$name}{lignes};
    et tu retrouveras les valeurs qui se trouvaient respectivement dans les variables $taillefic et $line_count au moment où tu as alimenté cette partie de ton hash.

  17. #17
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Par pitié, enlève tous ces commentaires inutiles de ton code (ainsi que les lignes de code mises en commentaire), que l'on voie clairement et en quelques lignes seulement ce qu'il fait.

    Pour ton problème, si je comprends bien, tu passes deux fois le même paramètre au programme et il ne traite bien que le premier.

    Dans ce cas, la règle de base pour déboguer, c'est de voir comment le programme récupère ces params, par exemple en les imprimant dès le départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $fichier_1 = $ARGV[0];
    my $fichier_2 = $ARGV[1];
    print "Fic 1: $fichier_1; Fic2: $fichier_2 \n";
    Sinon, je te conseille vivement de lire la FAQ suivante: Débogage en Perl.

    Avec ces techniques, tu devrais pouvoir répondre par toi-même à la plupart des questions que tu poses.

    Pour ta question relative à l'utilisation des hachages, ma réponse dans mon post précédent est-elle suffisante? Sinon, poste STP ce qu'affiche un print Dumper sur ce hash (en ne gardant que quelques entrées s'il y en a beaucoup).

  18. #18
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $fichier_1 = $ARGV[0];
    my $fichier_2 = $ARGV[1];
    Les 2 paramètres sont identiques dans le print et mais le problème disparait si je mais un espace après le second paramètre ?

    Donc pour lire mes 2 fichiers de hash il me faut repartir de la liste des fichiers et donc re boucler

    avec quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $files_hash_1{$name} = { taille => $taillefic , lignes => $line_count ,topvalide => "faux", nomfic => $deffic[1]  , nomrep => $deffic[2] };
     
      foreach my $name ( @T_fic1) {
         my $taille  = $files_hash_1{$name} {taille};
         my $line_count = $files_hash_1{$name} {lignes };
    ...
    Me reste a faire des algo de tries avec cette boucle ainqi que les algo de comparaison.
    Je doute que les process de tri style short ... et consort soit des plus adpaté?

    ou peut on éventuelle utiliser des commande de Dumper pour faire le traitement?

    chose curieux print Dumper affcihe les information dans un ordre différent de celui de la création de la Table , on peut donc supposé qu'il y a des outils sur cette fonction perl.

  19. #19
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut OU est mon incomprehension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     sub Nomfic { 
     	my @RT_FIC ="";
     	my $valeur = "/";
     	# print ("$_[0] §/n");
    	my @T_FIC  =  split(/${valeur}/,$_[0]); # décooupe le nom long selon le caractères /
        my $nom_fichier = $T_FIC[$#T_FIC]; # L’indice du dernier element d’une variable tableau est accessible par la variable scalaire $#nom-du-tableau.
    	my $nom_repertoire =$T_FIC[$#T_FIC -1];
    #	print ("nom_fichier = $nom_fichier \n");
    #	print ("nom_repertoire= $nom_repertoire \n");
    	push(@RT_FIC,$nom_fichier,$nom_repertoire);
    #  print ("return = @RT_FIC \n");
      return  @RT_FIC;
     
     	}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       foreach my $name ( @T_fic2) {
      #debug mode
        print "name: $name\n";	
        my $line_count =  0 ;
      	$line_count = compteurdeligne_fichier($name);  
     	my $taillefic  = -s $name;
     	my @deffic = Nomfic( $name);
        my $valeur = "_";
    	my $nomfic = $deffic[0];
    	print (" deffic  : @deffic  \n ");
    	print (" nomfic  : $nomfic  \n ");
    	print (" deffic-1 $deffic[1]     \n ");
     	print (" deffic-1 $deffic[2]     \n ");
    }

    name: ./dev/SIM/R/20160220041004_R/R_NOE_20160220041004_ZON.dat
    deffic : R_NOE_20160220041004_ZON.dat 20160220041004_R
    nomfic :
    deffic-1 R_NOE_20160220041004_ZON.dat
    deffic-1 20160220041004_RFNPN615-S7690835-GTW-1047049-20160220041001

    name: ./dev/SIM/R/20160220041004_R/R_NOE_20160220041004_ZON1.dat
    deffic : R_NOE_20160220041004_ZON.dat 20160220041004_R
    nomfic :
    deffic-1 R_NOE_20160220041004_ZON1.dat
    deffic-1 20160220041004_RFNPN615-S7690835-GTW-1047049-20160220041001
    pourquoi cette liste ce tableau début avec l'index 1 est non zero?

  20. #20
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    chose curieux print Dumper affcihe les information dans un ordre différent de celui de la création de la Table , on peut donc supposé qu'il y a des outils sur cette fonction perl.
    Par définition, un hachage n'est jamais trié et est stocké dans un ordre pseudo-aléatoire. C'est en quelque sorte la rançon de la très grande rapidité d'accès aux données d' unhachage. Il n'est pas possible de trier un hachage, mais on peut trier sans difficulté l'ordre dans lequel on va traiter ou afficher ses données.

Discussions similaires

  1. Morceau de script pas très clair
    Par rouget dans le forum Unix
    Réponses: 2
    Dernier message: 18/11/2010, 09h14
  2. Tracker un "File does not exist" pas très claire.
    Par Moustico dans le forum Apache
    Réponses: 2
    Dernier message: 10/06/2010, 14h11
  3. Paragraphe pas très clair
    Par lulu51 dans le forum Contrat
    Réponses: 26
    Dernier message: 22/04/2008, 16h01
  4. CRC-32 Pas très clair
    Par Goundy dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 17/10/2006, 21h04
  5. [Tableaux] pas très sur de la méthode...
    Par Thierry8 dans le forum Langage
    Réponses: 7
    Dernier message: 12/10/2005, 13h25

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