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 :

parsing d'un dossier contenant plusieurs fichiers


Sujet :

Langage Perl

  1. #61
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pourquoi copier les valeurs de %dirs dans d'autres variables ? Pourquoi ne pas les utiliser directement :
    - soit à partir de %dirs si l'usage se trouve encore dans sa portée
    - soit en passant %dirs (ou sa référence) en paramètre d'une fonction si l'usage se trouve hors de sa portée
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  2. #62
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Pourquoi copier les valeurs de %dirs dans d'autres variables ? Pourquoi ne pas les utiliser directement :
    - soit à partir de %dirs si l'usage se trouve encore dans sa portée
    - soit en passant %dirs (ou sa référence) en paramètre d'une fonction si l'usage se trouve hors de sa portée
    Je dois faire cela, car je devrais utiliser ces variables dans des boucles for et si j'utilise directement les valeurs de %dirs le programme mettra beaucoup plus de temps à s'ouvrir et je trouve que c'est plus simple en affectant chaque valeur à une variable.

    Sait - tu comment procéder ?

    Merci

  3. #63
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    J'ai réussi en transformant le tableau associatif en simple tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @nombre;
     
    	@nombre = values (%dirs);
     
    	my $var1 = $nombre[0];
    Mais ce qu'il faudrait que je fasse c'est qu sa soit automatique, car ce ne sera pas toujours le même nombre de dossier sur chaque répertoire

    et plutôt que d'écrire cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	my $var1 = $nombre[0];
    	my $var2 = $nombre[1];
    	my $var3 = $nombre[2];
    	my $var4 = $nombre[3];
    Il faudrait que je puisse faire cela avec une boucle for comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		for (my $i =0;$i<3;$i++)
    	{
    	my $var$i = $nombre[$i];
     
    	}
    Est - ce -que c'est possible ?
    merci.

  4. #64
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par shalfat Voir le message
    Je dois faire cela, car je devrais utiliser ces variables dans des boucles for et si j'utilise directement les valeurs de %dirs le programme mettra beaucoup plus de temps à s'ouvrir et je trouve que c'est plus simple en affectant chaque valeur à une variable.
    Je ne vois pas pourquoi tu dis que ce serait plus lent et moins simple ? (même si l'accès à un scalaire nommé et sans doute plus rapide que l'accès à une valeur de hash, pas sûr que dans ton cas d'utilisation ce soit le vrai, et pas sûr non plus que la différence soit significative par rapport au reste du traitement).
    Sinon, tu peux avant la boucle affecter des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($var1, $var2, $var3) = ($H{cle1}, $H{cle2}, $H{cle3});
    (ou encore écrit : my ($var1, $var2, $var3) = @H{qw(cle1 cle2 cle3)};)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #65
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Je ne vois pas pourquoi tu dis que ce serait plus lent et moins simple ? (même si l'accès à un scalaire nommé et sans doute plus rapide que l'accès à une valeur de hash, pas sûr que dans ton cas d'utilisation ce soit le vrai, et pas sûr non plus que la différence soit significative par rapport au reste du traitement).
    Peut être que tu a raison mais je pense qu'il sera plus facile pour moi de m'y retrouver de cette manière car je suis débutant en perl.

    Citation Envoyé par Philou67430 Voir le message
    Sinon, tu peux avant la boucle affecter des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($var1, $var2, $var3) = ($H{cle1}, $H{cle2}, $H{cle3});
    (ou encore écrit : my ($var1, $var2, $var3) = @H{qw(cle1 cle2 cle3)};)
    Ou veux tu en venir avec cette ligne de code Philou, je ne saisis pas, car je voulais savoir s'il n'y avait pas un moyen d'affecter les variables avec une boucle car je ne sais pas combien de variables j'ai besoin et combien de valeurs il y a dans mon tableau, tout dépendra du répertoire dans lequel je me trouverai.

    Est - ce -possible ?
    Merci.

  6. #66
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non, créer des variables nommées dynamiquement n'est jamais la bonne solution (même si c'est possible en supprimant "use strict;"... ce qui n'est jamais une bonne idée non plus).

    Dis-nous plutôt ce que tu veux faire avec le contenu de %dirs.

    Tu vois bien que j'utilise ce contenu dans ma boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach my $dir (sort (keys %dirs)) {
      print "Il y a $dirs{$dir} fichiers dans le répertoire $dir.\n";
      print $resumeFh "Il y a $dirs{$dir} fichiers dans le répertoire $dir.\n";
    }
    Donc tu dois pouvoir faire ce que tu souhaites en utilisant keys(), values() ou each() et une boucle for ou while (pour each()).

    --
    Jedaï

  7. #67
    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 Jedai Voir le message
    Non, créer des variables nommées dynamiquement n'est jamais la bonne solution (même si c'est possible en supprimant "use strict;"... ce qui n'est jamais une bonne idée non plus).
    ++. Je plussoie entièrement.

    Utiliser un hash est plus fiable, plus sûr et plus clair qu'utiliser des références symboliques qui conduisent à toutes sortes d'erreurs sournoises.

  8. #68
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Non, créer des variables nommées dynamiquement n'est jamais la bonne solution (même si c'est possible en supprimant "use strict;"... ce qui n'est jamais une bonne idée non plus).

    Dis-nous plutôt ce que tu veux faire avec le contenu de %dirs.

    Tu vois bien que j'utilise ce contenu dans ma boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach my $dir (sort (keys %dirs)) {
      print "Il y a $dirs{$dir} fichiers dans le répertoire $dir.\n";
      print $resumeFh "Il y a $dirs{$dir} fichiers dans le répertoire $dir.\n";
    }
    Donc tu dois pouvoir faire ce que tu souhaites en utilisant keys(), values() ou each() et une boucle for ou while (pour each()).

    --
    Jedaï

    Ok.

    En gros pour chaque fichier texte de chaque répertoire grâce à mon code j'extrait les lignes et j'écris sur un tableau excel les informations que j'ai trouvé par 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
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 		0
     
    Nombre d'études de la colonne vertébrale  réalisées : 		1						
     
    Nombre d'études des paramètres pelviens réalisées : 		0
     
    Nombre d'études de la hanche réalisées : 			0			
     
    Nombre d'études de la jambe (Knee Workflow) réalisées : 		0			
     
    Nombre de modèles des membres inférieurs réalisés : 		0			
     
    Nombre de paramètres ajoutés au rapport excel : 	0				
     
    Nombre de rapports word générés : 	2

    Cela se fait pour chaque fichier, grâce à ton code j’obtenais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Nombre de fichiers dans le répertoire : 25							
    10 fichiers dans le répertoire C:/Log/Log2
     
    4 fichiers dans le répertoire C:/Log/Log3.
     
    5 fichiers dans le répertoire C:/Log/Log4.
     
    6 fichiers dans le répertoire C:/Log/Log5.
    J'obtient donc 25 fois le résultat précédent, pour chaque fichier.

    Ce que je voulais faire c'est dans une autre feuille de calcul écrire la somme des études pour chaque répertoire,dans notre cas, j'aurais 4 fois le tableau excel que j'ai mis précédemment un pour chaque répertoire. Je fais les sommes grâce à des formules excel et des boucles for.

    Le problème c'est que je dois faire cela pour x répertoire et pour x fichier, tout dépendra du répertoire dans lequel je me trouve.

    Je ne sais pas comment faire car dans ma feuille excel avec les tableau excel, ils sont tous l'un à la suite de l'autre, les 10 tableaux pour le répertoire log2, puis les 4 tableaux pour le répertoire log3, etc... et pour faire des sommes je dois savoir quand s'arrête et commence les tableaux d'un répertoire différent.


    J'avais pensé à une boucle foreach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach $nom_des_repertoires (@nom_des_repertoires)	# Boucle foreach qui s'execute pour chaque repertoire inscrit dans le tableau @nom_des_repertoires
    	{
    $worksheet9 ->write(13+$offset_etude_par_repertoire,0,"R\xE9pertoire $nom_des_repertoires",$format1);
    	$worksheet9 ->write(16+$offset_etude_par_repertoire,0,"Nombre d'\xE9tudes de la posture globale (Postural assessment Workflow) r\xE9alis\xE9es : ",$format);
    etc...
    Mais par contre je ne sais pas comment faire pour calculer la somme des études.
    Avez - vous compris ? ^^
    Avez - vous une solution à me conseiller ?

    Merci

  9. #69
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Bonjour.

    Alors je vais essayer de m'expliquer plus clairement.

    En gros je dois réaliser une boucle for je pense, qui me permettra d'effectuer les opérations dont j'ai besoin.

    Dans le cas que j'expliquai, voila les fichiers de mon répertoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Nombre de fichiers dans le répertoire : 25							
    10 fichiers dans le répertoire C:/Log/Log2
     
    4 fichiers dans le répertoire C:/Log/Log3.
     
    5 fichiers dans le répertoire C:/Log/Log4.
     
    6 fichiers dans le répertoire C:/Log/Log5.

    Chaque fichier est analysé et on renvoi un résultat sur une feuille de calcul excel (dans mon cas elle s'appelle etudes par fichier), le résultat est le suivant avec les numéro qui varie en fonction des fichiers.
    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
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 		0
     
    Nombre d'études de la colonne vertébrale  réalisées : 		1						
     
    Nombre d'études des paramètres pelviens réalisées : 		0
     
    Nombre d'études de la hanche réalisées : 			0			
     
    Nombre d'études de la jambe (Knee Workflow) réalisées : 		0			
     
    Nombre de modèles des membres inférieurs réalisés : 		0			
     
    Nombre de paramètres ajoutés au rapport excel : 	0				
     
    Nombre de rapports word générés : 	2
    Mon but, est de calculer le nombre d'étude de chaque répertoire log 2,3,4 et 5 et de les écrire de la même manière sur une autre feuille excel.

    J'ai analysé les début et fin des cellules de la feuille études par fichier et en gros, je dois réaliser 4 boucles for ( je prends uniquement l'etudes de la posture globale)
    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
    for ($i = 16;$i<=394;$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    for ($i = 436;$i<=562;$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    for ($i = 604;$i<=772;$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    for ($i = 814;$i<=1024;$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    Le problème c'est qu'il faut que j'obtienne cela avec une seule boucle for car d'une je ne sais pas combien j'aurais de répertoire différent et d'autre part, cela serait beaucoup trop long pour chaque étude.

    Avant ces boucles for j'ai écrit
    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
    my $nom_des_repertoires;	# Initialisation de la variable nom_des_repertoires
    	my $offset_etude_par_repertoire = 0;	# Initialisation de la variable offset_etude_par_repertoire
    	my $nb_fichier_par_repertoire;
    	my $i = 0;
     
    	my $cpt_total_postural_assessment_study_par_repertoire = "=";
     
     
    	foreach $nb_fichier_par_repertoire (@nb_fichier_par_repertoire)
    	{
    	Boucle for
    	...
     
     
     
    	foreach $nom_des_repertoires (@nom_des_repertoires)	# Boucle foreach qui s'execute pour chaque repertoire inscrit dans le tableau @nom_des_repertoires
    	{
     
     
    		# Ecriture dans la neuvième feuille de calcul excel (worksheet9)
    	$worksheet9 ->write(3,0,"Nombre de fichiers dans le r\xE9pertoire : $nb_fichier",$format);
    	$worksheet9 ->write(13+$offset_etude_par_repertoire,0,"R\xE9pertoire $nom_des_repertoires",$format1);
    	$worksheet9 ->write(16+$offset_etude_par_repertoire,0,"Nombre d'\xE9tudes de la posture globale (Postural assessment Workflow) r\xE9alis\xE9es : ",$format);
    	$worksheet9 ->write(16+$offset_etude_par_repertoire,9,"$cpt_total_postural_assessment_study_par_repertoire", $format2);
    J'ai remarquer que dans une boucle, la condition vaut $i+(nb_fichier_par_repertoire - 1)*42

    Mais je ne sais pas comment réaliser cela, peut être il y a une autre solution ?

    Merci de votre aide.

  10. #70
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Rebonjour,

    J'ai presque réussi
    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
    	my $nb_fichier_par_repertoire;
     
    	my $cpt_total_postural_assessment_study_par_repertoire = "=";
     
     
    	my $w = 16;
    	my $z = 0;
    	my $s = 16;
     
    	for (my $j = 0;$j<=3;$j++)#foreach $nb_fichier_par_repertoire (@nb_fichier_par_repertoire)
    	{	
    	for (my $i=$s ;$i<=($w+(($nb_fichier_par_repertoire[$j]-1)*42));$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    		$s = $s+ ($nb_fichier_par_repertoire[$j]*42);
    		$w  = $w + ($nb_fichier_par_repertoire[$j]*42);
    		$worksheet9->write($z+0,12,"$cpt_total_postural_assessment_study_par_repertoire",$format);
    			$z++;
     
     
    			}
    Le problème c'est que j'obtient comme résultats
    Alors que je veux obtenir
    Je sais pas pourquoi il fait l'addition je pense c'est que l'initialisation de la deuxième boucle for est mauvaise mais je n'arrive pas à la modifier afin d'obtenir le résultat que je souhaite

    Merci de votre aide.

  11. #71
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    ... Ton explication n'est pas très claire et ton code est bizarrement indenté, apprends à indenter correctement, cela aidera beaucoup à la lisibilité de ton code ! Lit perlstyle et utilise perltidy éventuellement.

    Voici néanmoins une structure qui te permettrait a priori de répondre à tes besoins :
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use File::Find;
     
    my $resume = "nombreLogDansRepertoires.txt";   
    open (my $resumeFh, '>', $resume)
      or die "Impossible d'ouvrir le fichier $resume en ecriture";
     
    my %dirs;
     
    sub compteParRep {
      push(@{$dirs{$File::Find::dir}}, $File::Find::name) if m/^Trace_.*\.log$/;
    }
     
    find( \&compteParRep, 'C:/Log' );
     
    # ouvrir/créer la feuille excel, initialiser les offsets globaux
     
    foreach my $dir (sort (keys %dirs)) {
      my @files = sort @{$dirs{dir}};
      my $nbFiles = @files;
      print "Il y a $nbFiles fichiers dans le répertoire $dir.\n";
      print $resumeFh "Il y a $nbFiles fichiers dans le répertoire $dir.\n";
     
      # initialiser les offsets locaux, qui ne concernent qu'un répertoire
     
      foreach my $file (@files) {
        # traiter un fichier normalement
      }
     
      # inscrire le résumé des études faites dans ce répertoire dans la feuille
    }
     
    close $resumeFh;
    J'espère que tu y arriveras avec cette structure.
    --
    Jedaï

  12. #72
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jedai Voir le message
    ... Ton explication n'est pas très claire et ton code est bizarrement indenté, apprends à indenter correctement, cela aidera beaucoup à la lisibilité de ton code ! Lit perlstyle et utilise perltidy éventuellement.

    Voici néanmoins une structure qui te permettrait a priori de répondre à tes besoins :
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use File::Find;
     
    my $resume = "nombreLogDansRepertoires.txt";   
    open (my $resumeFh, '>', $resume)
      or die "Impossible d'ouvrir le fichier $resume en ecriture";
     
    my %dirs;
     
    sub compteParRep {
      push(@{$dirs{$File::Find::dir}}, $File::Find::name) if m/^Trace_.*\.log$/;
    }
     
    find( \&compteParRep, 'C:/Log' );
     
    # ouvrir/créer la feuille excel, initialiser les offsets globaux
     
    foreach my $dir (sort (keys %dirs)) {
      my @files = sort @{$dirs{dir}};
      my $nbFiles = @files;
      print "Il y a $nbFiles fichiers dans le répertoire $dir.\n";
      print $resumeFh "Il y a $nbFiles fichiers dans le répertoire $dir.\n";
     
      # initialiser les offsets locaux, qui ne concernent qu'un répertoire
     
      foreach my $file (@files) {
        # traiter un fichier normalement
      }
     
      # inscrire le résumé des études faites dans ce répertoire dans la feuille
    }
     
    close $resumeFh;
    J'espère que tu y arriveras avec cette structure.
    --
    Jedaï
    Ok merci de tes conseils, j'essayerais ton code demain, mais si tu a le temps, est ce que tu voit l'erreur que j'ai faite dans ce que j'ai expliqué tout à l'heure parce que je ne comprend pas et c'est important que je réussisse cela. Merci beaucoup dans tout les cas.

    J'ai presque réussi
    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
     
     
    	my $nb_fichier_par_repertoire;
     
    	my $cpt_total_postural_assessment_study_par_repertoire = "=";
     
     
    	my $w = 16;
    	my $z = 0;
    	my $s = 16;
     
    	for (my $j = 0;$j<=3;$j++)#foreach $nb_fichier_par_repertoire (@nb_fichier_par_repertoire)
    	{	
    	for (my $i=$s ;$i<=($w+(($nb_fichier_par_repertoire[$j]-1)*42));$i+=42) 
    		{
    		$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    		}
    		$s = $s+ ($nb_fichier_par_repertoire[$j]*42);
    		$w  = $w + ($nb_fichier_par_repertoire[$j]*42);
    		$worksheet9->write($z+0,12,"$cpt_total_postural_assessment_study_par_repertoire",$format);
     
                    $z++;
     
     
    	}
    Le problème c'est que j'obtient comme résultats

    3
    5
    7
    9

    Alors que je veux obtenir

    3
    2
    2
    2

    Je sais pas pourquoi il fait l'addition je pense c'est que l'initialisation de la deuxième boucle for est mauvaise mais je n'arrive pas à la modifier afin d'obtenir le résultat que je souhaite

    Merci de votre aide.

  13. #73
    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
    Il n'y a rien de mal à demander de l'aide quand on est bloqué, mais c'est aussi en essayant de résoudre ses problèmes soi-même que l'on progresse réellement. Dans certains cas au moins sur ce long fil, tu as posé des questions que tu aurais pu résoudre toi-même ou auxquelles des réponse antérieures donnaient des solutions.

    Là, on a un peu de mal à comprendre quel est ton problème et comme on n'a pas (sauf erreur) de données réelles en entrée, c'est un peu difficile de t'aider.

  14. #74
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Il n'y a rien de mal à demander de l'aide quand on est bloqué, mais c'est aussi en essayant de résoudre ses problèmes soi-même que l'on progresse réellement. Dans certains cas au moins sur ce long fil, tu as posé des questions que tu aurais pu résoudre toi-même ou auxquelles des réponse antérieures donnaient des solutions.

    Là, on a un peu de mal à comprendre quel est ton problème et comme on n'a pas (sauf erreur) de données réelles en entrée, c'est un peu difficile de t'aider.

    Oui je comprend ce que tu veux dire, c'est vrai que dans ce cas il est très dure pour vous de m'aider car vous ne disposez pas de tout mon code et de plus expliquer ce que je dois faire à l'écrit est très compliqué.

    Je vais essayer d'arranger mon programme pour obtenir comme résultat

    3
    2
    2
    2

    à la place de

    3
    5
    7
    9

    C'est tous ce qu'il me reste à faire et après j'aurais fini car j'arrive à compter les paramètres de chaque répertoire grâce à des boucles for il faut juste que j’empêche l'addition de ce faire

    3
    3+2
    5+2
    7+2

    Mais ça fait au moins 4 h que je suis dessus et je n'y arrive pas, d'où ma sollicitation de votre aide.


    J'ai identifier la source du problème car mes indices sont bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    C'est cette ligne qui effectue l'addition, une idée de ce que je dois changer ?

    Merci

  15. #75
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Pour être franc je n'arrive pas non plus à suivre la logique.
    Mais à tout hasard, je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (my $i=$s ;$i<=($w+(($nb_fichier_par_repertoire[$j]-1)*42));$i+=42)
    ET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    Dans un tu utilises $j (Minuscule) dans l'autre !J$i+ Majuscule

    Désolé si c'est une ânerie, mais en faisant au pif, on n'y arrivera pas.

    Il me semble que ce que tu écris est fortement lié à la structure des données actuelles : profondeur des répertoires par exemple...
    Si cette structure n'évolue pas, ce n'est pas ridicule...
    Si elle évolue tu auras un mal fou à maintenir ton programme.

    Imagine une structure semblable à : Commune, Canton, Sous-préfecture, Préfecture, Région.
    Si dans un premier temps tu construis ton programme de façon à fournir des résultats au niveau Canton et Préfecture,
    le jour où on te demanderas des totaux à chaque niveau, vu comme c'est parti ça sera la galère.

    En un mot pense à la maintenance à venir.

  16. #76
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Bonjour

    Non ce n'est pas la cause du problème ($j est une variable et le j majuscule correspond à la colonne dans un tableau excel.

    J'ai écris ce code un peu plus clair.

    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
     
    my $cpt_total_postural_assessment_study_par_repertoire = "=";
    my $indice_debut_postural_assessment_study_par_repertoire = 16;
    my $indice_fin_postural_assessment_study_par_repertoire = 16;
    my $offset_compteur_par_repertoire = 0;	# Initialisation de offset_compteur_par_repertoire
     
    for (my $j = 0;$j<=$taille_nb_fichier_par_repertoire;$j++)	# Début boucle for qui traite chaque numéro du tableau nb_fichier_par_repertoire
    		{	
    		$indice_fin_postural_assessment_study_par_repertoire = ($indice_debut_postural_assessment_study_par_repertoire+(($nb_fichier_par_repertoire[$j]-1)*42)); # Indice de fin dans le tableau excel
    		for (my $i=$indice_debut_postural_assessment_study_par_repertoire ;$i<=$indice_fin_postural_assessment_study_par_repertoire;$i+=42)# Deuxième boucle for qui traite les indices de début et fin des études 
     
    			{
    			$cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
     
    			}
     
    		$worksheet9 ->write($offset_compteur_par_repertoire+16,12,"$indice_debut_postural_assessment_study_par_repertoire ",$format2);# test pour vérifier si les indices_debut sont correct
    		$worksheet9 ->write($offset_compteur_par_repertoire+17,12,"$indice_fin_postural_assessment_study_par_repertoire ",$format2);# Test pour vérifier si indice_fin est correct
    		$indice_debut_postural_assessment_study_par_repertoire = $indice_debut_postural_assessment_study_par_repertoire+ ($nb_fichier_par_repertoire[$j]*42);# Incrémentation de indice_debut
     
                    $worksheet9 ->write($offset_compteur_par_repertoire+16,9,"$cpt_total_postural_assessment_study_par_repertoire", $format2);   # Affichage du compteur
     
                   $offset_compteur_par_repertoire++;	
    		}
    En gros sur excel j'obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 	3			16 
    												                 394 
     
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 	5			436 
    												                  562 
     
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 	7			604
    												                  772 
     
    Nombre d'études de la posture globale (Postural assessment Workflow) réalisées : 	9			814 
    												                 1024
    Comme je l'ai déjà dit les indices affichés sont correct, le problème c'est juste que à la place de 3, 5, 7 et 9 je devrais obtenir 3,2,2 et 2

    C'est très bizarre car les indices sont correct, je ne comprend pas pourquoi dans ce cas la je n'obtient pas mon résultat.
    En cliquant sur la cellule excel des chiffres 3,5,7 et 9 on peut voir que ça ne prend pas en compte l'indice de début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    On a 3 ='Etudes par fichier'!J16+'Etudes par fichier'!J58+'Etudes par fichier'!J100+'Etudes par fichier'!J142+'Etudes par fichier'!J184+'Etudes par fichier'!J226+'Etudes par fichier'!J268+'Etudes par fichier'!J310+'Etudes par fichier'!J352+'Etudes par fichier'!J394
     
    5 ='Etudes par fichier'!J16+'Etudes par fichier'!J58+'Etudes par fichier'!J100+'Etudes par fichier'!J142+'Etudes par fichier'!J184+'Etudes par fichier'!J226+'Etudes par fichier'!J268+'Etudes par fichier'!J310+'Etudes par fichier'!J352+'Etudes par fichier'!J394+'Etudes par fichier'!J436+'Etudes par fichier'!J478+'Etudes par fichier'!J520+'Etudes par fichier'!J562
     
    7 ='Etudes par fichier'!J16+'Etudes par fichier'!J58+'Etudes par fichier'!J100+'Etudes par fichier'!J142+'Etudes par fichier'!J184+'Etudes par fichier'!J226+'Etudes par fichier'!J268+'Etudes par fichier'!J310+'Etudes par fichier'!J352+'Etudes par fichier'!J394+'Etudes par fichier'!J436+'Etudes par fichier'!J478+'Etudes par fichier'!J520+'Etudes par fichier'!J562+'Etudes par fichier'!J604+'Etudes par fichier'!J646+'Etudes par fichier'!J688+'Etudes par fichier'!J730+'Etudes par fichier'!J772
     
    9 ='Etudes par fichier'!J16+'Etudes par fichier'!J58+'Etudes par fichier'!J100+'Etudes par fichier'!J142+'Etudes par fichier'!J184+'Etudes par fichier'!J226+'Etudes par fichier'!J268+'Etudes par fichier'!J310+'Etudes par fichier'!J352+'Etudes par fichier'!J394+'Etudes par fichier'!J436+'Etudes par fichier'!J478+'Etudes par fichier'!J520+'Etudes par fichier'!J562+'Etudes par fichier'!J604+'Etudes par fichier'!J646+'Etudes par fichier'!J688+'Etudes par fichier'!J730+'Etudes par fichier'!J772+'Etudes par fichier'!J814+'Etudes par fichier'!J856+'Etudes par fichier'!J898+'Etudes par fichier'!J940+'Etudes par fichier'!J982+'Etudes par fichier'!J1024
    Alors que je devrais obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    3 ='Etudes par fichier'!J16+'Etudes par fichier'!J58+'Etudes par fichier'!J100+'Etudes par fichier'!J142+'Etudes par fichier'!J184+'Etudes par fichier'!J226+'Etudes par fichier'!J268+'Etudes par fichier'!J310+'Etudes par fichier'!J352+'Etudes par fichier'!J394
     
    5 ='Etudes par fichier'!J436+'Etudes par fichier'!J478+'Etudes par fichier'!J520+'Etudes par fichier'!J562
     
    7 ='Etudes par fichier'!J604+'Etudes par fichier'!J646+'Etudes par fichier'!J688+'Etudes par fichier'!J730+'Etudes par fichier'!J772
     
    9 ='Etudes par fichier'!J814+'Etudes par fichier'!J856+'Etudes par fichier'!J898+'Etudes par fichier'!J940+'Etudes par fichier'!J982+'Etudes par fichier'!J1024
    Je pense que le probème vient de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    car mes indices de début et fin sont toujours correct.

    Je ne peux pas être plus clair désolé.

    Savez - vous résoudre mon problème. Merci bien.

  17. #77
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    ... Réfléchis à ce que tu écris, fait afficher les résultats intermédiaires et regarde à quoi ils ressemblent. Par ailleurs, les noms de variables de trois lignes n'aident pas à la lisibilité.

    Le problème n'est pas avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    mais bien avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $cpt_total_postural_assessment_study_par_repertoire = "=";
    ou plutôt avec son emplacement. Tu démarres la création de ta formule avant de parcourir les dossiers, donc ta formule ne fait qu'accumuler, alors que tu devrais la réinitialiser pour chaque dossier.

    Par ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (my $j = 0;$j<=$taille_nb_fichier_par_repertoire;$j++)	# Début boucle for qui traite chaque numéro du tableau nb_fichier_par_repertoire
    		{	
                    # code avec $nb_fichier_par_repertoire[$j]
    		}
    est bien plus clair avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $nb_fichiers (@nb_fichier_par_repertoire) {
        # code avec $nb_fichiers
    }
    ce qui rend d'ailleurs le commentaire complètement superflu.

    --
    Jedaï

  18. #78
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jedai Voir le message
    .

    Le problème n'est pas avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cpt_total_postural_assessment_study_par_repertoire = $cpt_total_postural_assessment_study_par_repertoire . qq('Etudes par fichier'!J$i+);
    mais bien avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $cpt_total_postural_assessment_study_par_repertoire = "=";
    ou plutôt avec son emplacement. Tu démarres la création de ta formule avant de parcourir les dossiers, donc ta formule ne fait qu'accumuler, alors que tu devrais la réinitialiser pour chaque dossier.

    --
    Jedaï

    Merci beaucoup pour ton aide et tes conseils. J'ai changé la ligne de place et le programme fonctionne !



    Mais, j'ai un nouveau problème avec les tableaux associatifs.

    J'ai fait un 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
    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
     
    use warnings; 
    use strict; 
    use File::Find;
     
    my $fichier_txt = "C:\\Documents and Settings\\FichierLog\\test_cpt_fichier.txt";   #emplacement du fichier crée "fichier_txt"
    my $fh_txt;
    open ($fh_txt, '>', $fichier_txt) or die "Impossible d'ouvrir le fichier en ecriture";	# Ouverture du fichier pour l'écriture
     
     
    sub parcours_dir	# Fonction parcours_dir qui récupère les fichiers du répertoire appellé  
    	{
        my ($path) = @_;	# La variable path récupère la liste des paramètres qui arrivent au sous - programme
    	my @dir_entries = glob("$path/*");
    	foreach my $entry (@dir_entries)	# Boucle foreach qui gère chaque entrée (fichier) du répertoire
    		{
            programme_principal($entry) if -f $entry && $entry =~ m/Trace/;	
            parcours_dir($entry) if -d $entry;	# Si l'entrée est un dossier, on appelle à nouveau parcours_dir pour trouver un fichier
    		}
    	} 
     
     
    my $nb_fichier;	# Initialisation de la variable $nb_fichier
    sub recherche	# Sous programme recherche 
    	{
    	if (-f)
    		{
    		++$nb_fichier if $File::Find::name =~ /Trace/;	
    		}	
    	}
     
    find(\&recherche,"C:\\Log");	
     
    print "Il y a $nb_fichier fichiers dans le repertoire C:\\Log : \n\n";	
    print $fh_txt "Il y a $nb_fichier fichiers dans le repertoire C:\\Log : \n\n";	
     
     
    my %dirs;
    sub compteParRep 
    	{
    	$dirs{$File::Find::dir}++ if m/Trace_.*\.log$/;
    	}
     
    find( \&compteParRep, "C:\\Log" );
     
    foreach my $dir ( sort(keys %dirs)) 
    	{
    	print "$dirs{$dir} fichiers dans le repertoire $dir.\n";
    	print $fh_txt "$dirs{$dir} fichiers dans le repertoire $dir.\n";
    	print "\n";
    	print $fh_txt "\n";
    	}
     
    my @nb_fichier_par_repertoire;
    @nb_fichier_par_repertoire = (values (%dirs));
     
    my @nom_des_repertoires;
    @nom_des_repertoires = sort(keys (%dirs));
     
    foreach my $nom_des_repertoires (@nom_des_repertoires)
    {
    print "$nom_des_repertoires\n";
     
    }
     
    print "\n\n";
     
    print "$nb_fichier_par_repertoire[0]\n";
    print "$nb_fichier_par_repertoire[1]\n";
    print "$nb_fichier_par_repertoire[2]\n";
    print "$nb_fichier_par_repertoire[3]\n";
    print "\n\n";
     
     
    sub programme_principal
    	{
    	my $fichier =shift;	
    	print "$fichier\n";
    	print $fh_txt "$fichier\n";
    	}
     
     
    parcours_dir("C:/Log");	# Appel de la fonction parcours_dir avec le répertoire que l'on veut analyser en paramètres
     
     
    close $fh_txt;	# Fermeture du fichier fh_txt
     
    <>;
    Quand je lance ce programme j'obtient
    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
    	Il y a 22 fichiers dans le répertoire C:\Log						
    4 fichiers dans le répertoire C:/Log/Log_larib
    4 fichiers dans le répertoire C:/Log/Log_larib2.
    9 fichiers dans le répertoire C:/Log/Log_l'Union
    5 fichiers dans le répertoire C:/Log/Log_stage.				
     
     C:/Log/Log_larib
     C:/Log/Log_larib2.
     C:/Log/Log_l'Union
     C:/Log/Log_stage.	
     
    4
    4
    5
    9
    J'ai le même problème dans mon vrai programme mais comme cela c'est plus facile à comprendre, ce que je ne comprend pas c'est pourquoi je n'obtient pas
    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
    Il y a 22 fichiers dans le répertoire C:\Log						
    4 fichiers dans le répertoire C:/Log/Log_larib
    4 fichiers dans le répertoire C:/Log/Log_larib2.
    9 fichiers dans le répertoire C:/Log/Log_l'Union
    5 fichiers dans le répertoire C:/Log/Log_stage.				
    
     C:/Log/Log_larib
     C:/Log/Log_larib2
     C:/Log/Log_l'Union
     C:/Log/Log_stage.	
    
    4
    4
    5
    9
    ça me fais la même chose sur mon programme principal, du coup tous mes calculs d'indice_debut et indice_fin sont changés et mauvais.

    Avez - vous la solution pour avoir un ordre correct entre le nom des répertoires et le nombre de fichier ? Merci beaucoup

  19. #79
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 92
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par shalfat Voir le message
    Merci beaucoup pour ton aide et tes conseils. J'ai changé la ligne de place et le programme fonctionne !



    Mais, j'ai un nouveau problème avec les tableaux associatifs.

    J'ai fait un 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
    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
     
    use warnings; 
    use strict; 
    use File::Find;
     
    my $fichier_txt = "C:\\Documents and Settings\\FichierLog\\test_cpt_fichier.txt";   #emplacement du fichier crée "fichier_txt"
    my $fh_txt;
    open ($fh_txt, '>', $fichier_txt) or die "Impossible d'ouvrir le fichier en ecriture";	# Ouverture du fichier pour l'écriture
     
     
    sub parcours_dir	# Fonction parcours_dir qui récupère les fichiers du répertoire appellé  
    	{
        my ($path) = @_;	# La variable path récupère la liste des paramètres qui arrivent au sous - programme
    	my @dir_entries = glob("$path/*");
    	foreach my $entry (@dir_entries)	# Boucle foreach qui gère chaque entrée (fichier) du répertoire
    		{
            programme_principal($entry) if -f $entry && $entry =~ m/Trace/;	
            parcours_dir($entry) if -d $entry;	# Si l'entrée est un dossier, on appelle à nouveau parcours_dir pour trouver un fichier
    		}
    	} 
     
     
    my $nb_fichier;	# Initialisation de la variable $nb_fichier
    sub recherche	# Sous programme recherche 
    	{
    	if (-f)
    		{
    		++$nb_fichier if $File::Find::name =~ /Trace/;	
    		}	
    	}
     
    find(\&recherche,"C:\\Log");	
     
    print "Il y a $nb_fichier fichiers dans le repertoire C:\\Log : \n\n";	
    print $fh_txt "Il y a $nb_fichier fichiers dans le repertoire C:\\Log : \n\n";	
     
     
    my %dirs;
    sub compteParRep 
    	{
    	$dirs{$File::Find::dir}++ if m/Trace_.*\.log$/;
    	}
     
    find( \&compteParRep, "C:\\Log" );
     
    foreach my $dir ( sort(keys %dirs)) 
    	{
    	print "$dirs{$dir} fichiers dans le repertoire $dir.\n";
    	print $fh_txt "$dirs{$dir} fichiers dans le repertoire $dir.\n";
    	print "\n";
    	print $fh_txt "\n";
    	}
     
    my @nb_fichier_par_repertoire;
    @nb_fichier_par_repertoire = (values (%dirs));
     
    my @nom_des_repertoires;
    @nom_des_repertoires = sort(keys (%dirs));
     
    foreach my $nom_des_repertoires (@nom_des_repertoires)
    {
    print "$nom_des_repertoires\n";
     
    }
     
    print "\n\n";
     
    print "$nb_fichier_par_repertoire[0]\n";
    print "$nb_fichier_par_repertoire[1]\n";
    print "$nb_fichier_par_repertoire[2]\n";
    print "$nb_fichier_par_repertoire[3]\n";
    print "\n\n";
     
     
    sub programme_principal
    	{
    	my $fichier =shift;	
    	print "$fichier\n";
    	print $fh_txt "$fichier\n";
    	}
     
     
    parcours_dir("C:/Log");	# Appel de la fonction parcours_dir avec le répertoire que l'on veut analyser en paramètres
     
     
    close $fh_txt;	# Fermeture du fichier fh_txt
     
    <>;
    Quand je lance ce programme j'obtient
    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
    	Il y a 22 fichiers dans le répertoire C:\Log						
    4 fichiers dans le répertoire C:/Log/Log_larib
    4 fichiers dans le répertoire C:/Log/Log_larib2.
    9 fichiers dans le répertoire C:/Log/Log_l'Union
    5 fichiers dans le répertoire C:/Log/Log_stage.				
     
     C:/Log/Log_larib
     C:/Log/Log_larib2.
     C:/Log/Log_l'Union
     C:/Log/Log_stage.	
     
    4
    4
    5
    9
    J'ai le même problème dans mon vrai programme mais comme cela c'est plus facile à comprendre, ce que je ne comprend pas c'est pourquoi je n'obtient pas
    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
    Il y a 22 fichiers dans le répertoire C:\Log						
    4 fichiers dans le répertoire C:/Log/Log_larib
    4 fichiers dans le répertoire C:/Log/Log_larib2.
    9 fichiers dans le répertoire C:/Log/Log_l'Union
    5 fichiers dans le répertoire C:/Log/Log_stage.				
    
     C:/Log/Log_larib
     C:/Log/Log_larib2
     C:/Log/Log_l'Union
     C:/Log/Log_stage.	
    
    4
    4
    5
    9
    ça me fais la même chose sur mon programme principal, du coup tous mes calculs d'indice_debut et indice_fin sont changés et mauvais.

    Il faudrait que je trie les élements keys de %dirs et que en même temps chaque values soient triés comme les keys.

    Avez - vous la solution pour avoir un ordre correct entre le nom des répertoires et le nombre de fichier ? Merci beaucoup

  20. #80
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ton problème est que le premier parcours se fait alphabétiquement selon le nom des répertoires (parce que j'ai fait un "sort keys %dirs") et values() renvoie les valeurs d'un hash dans l'ordre interne du hash, qui est arbitraire (et éventuellement même aléatoire selon ta version de Perl).

    Pour corriger ceci, récupère les valeurs du hash dans le même ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @nom_des_repertoires = sort (keys %dirs);
    my @nb_fichier_par_repertoire = @dirs{ @nom_des_repertoires };
    (et arrête de déclarer et d'initialiser tes variables sur deux lignes, c'est une très mauvaise pratique et un accident en puissance, en plus d'être verbeux)
    ou si tu utilises plutôt (comme je te le recommanderais) la version qui crée un %dirs qui contient des listes de noms de fichiers, tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @nom_des_repertoires = sort (keys %dirs);
    my @nb_fichier_par_repertoire = map { scalar @{$_} } @dirs{ @nom_des_repertoires };
    Par ailleurs j'espère que dans ton programme réel tu ne fais pas plusieurs parcours de tes répertoires ? Celui qui crée %dirs avec les listes de fichiers suffit pour tout, par exemple si tu veux le nombre total de fichier, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use List::Util qw(sum);
    # ...
    my $nb_fichier = sum (map { scalar @{$_} } values %dirs);

    Par ailleurs tu n'arrêtes pas d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "...";	
    print $fh_txt "...";
    C'est une répétition disgracieuse et tu risques d'oublier de modifier les deux chaînes une fois, crée juste une sous routine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub doublePrint {
        my $fh = shift;
        print @_;
        print $fh @_
    }
     
    doublePrint( $fh_txt, "..." );
    --
    Jedaï

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

Discussions similaires

  1. Supprimer un dossier contenant des fichiers
    Par MasterMbg dans le forum Général Java
    Réponses: 7
    Dernier message: 24/11/2013, 17h33
  2. [SP-2007] Afficher le dossier contenant un fichier
    Par stellkar dans le forum SharePoint
    Réponses: 1
    Dernier message: 30/05/2011, 15h08
  3. Réponses: 3
    Dernier message: 23/10/2010, 21h57
  4. copier un dossier contenant des fichiers ouverts par d'autres application
    Par guefrachi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/07/2010, 19h55
  5. Trouver le nom du dossier contenant un fichier
    Par ceuce dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/09/2007, 17h20

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