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. #1
    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 parsing d'un dossier contenant plusieurs fichiers
    Bonjour à tous.

    J'écris car j'ai besoin de réaliser un parsing de fichier en utilisant perl.
    J'ai déjà écrit un programme qui me permet de parser un seul fichier texte et de chercher les informations qui m’intéressent afin d'écrire les résultats sur un fichier excel comprenant plusieurs feuilles.

    Mais à présent, je souhaiterais faire le parsing de tout un dossier contenant les mêmes styles de fichiers que j'ai réussi à parser grâce à mon premier programme.

    En faisant des recherches sur le forum j'ai pu lire que j'aurais besoin d'un base de donnée et du module DBi. J'aimerais savoir s'il s'agit de la seule solution car je débute en perl ?

    Le résultat que j'aimerai obtenir est un fichier excel comme celui que j'ai créer avec les mêmes informations pour tous les fichiers de mon dossier.

    Merci de votre aide.

  2. #2
    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
    Pour parcourir un dossier, il y a plus simple, et plusieurs solutions (cela dit, il est intéressant de savoir sur quel "système d'exploitation" ton script va tourner).

    D'abord, la solution d'utiliser la fonction glob (dans le Core de perl).
    Ensuite, la solution d'utiliser les fonctions opendir/readdir (dans le Core de perl).
    Et pour aller profondément dans l'arborescence, le module File::Find
    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

  3. #3
    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
    Pour parcourir un dossier, il y a plus simple, et plusieurs solutions (cela dit, il est intéressant de savoir sur quel "système d'exploitation" ton script va tourner).
    Mon script tourne sur windows xp actuellement.

    D'abord, la solution d'utiliser la fonction glob (dans le Core de perl).
    Ensuite, la solution d'utiliser les fonctions opendir/readdir (dans le Core de perl).
    Et pour aller profondément dans l'arborescence, le module File::Find
    Sinon j'avais vu la fonction glob sur des forums et c'est vrai qu'elle m'avait parut la plus simple d'utilisation. Mais je ne sais pas laquelle est la meilleure pour mon script

    C'est pour faire du parsing de tout les fichiers d'un même dossier et affiché le résultat sur excel, classé par différent fichier.

  4. #4
    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

    D'abord, la solution d'utiliser la fonction glob (dans le Core de perl).
    Bonjour Philou


    J'ai fais ce programme pour tester la fonction glob.
    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
    use strict;
    use warnings;
     
     
    my @files = glob ("C:\\Log\\test\\*.log");
     
    foreach my $file (@files)
    	{
     
    	my $fichier_txt = "C:\\Documents and Settings\\multiple_hip_log.txt";	# Emplacement du fichier "fichier_txt"
    	my $fh_txt;
     
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
    	open ($fh_txt, '>', $fichier_txt) or die "Impossible d'ouvrir le fichier en ecriture";	# Ouverture du fichier pour l'écriture
     
    	my $start_time;	# Initialisation de la variable start_time
     
    		while (my $ligne = <$FIC>)
    			{
     
    			my $end_time;	# Initialisation de la variable end_time
    			my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;	# Initialisation des variables de l'heure
     
    				if ($ligne =~ /Starting 3D/)	# Si "Starting sterEOS 3D" est écrit dans une ligne
    				{
    				print $fh_txt "Le logiciel s'est correctement ouvert\nLOG : $ligne\n\n";	# Ecrire dans le fichier Fonctionnement_SterEOS.txt
    				print "Le logiciel s'est correctement ouvert\nLOG : $ligne \n\n";	# Ecrire dans la console
    				my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    				$start_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60); # Calculer la valeur de start_time
    				}
     
    				elsif ($ligne =~ /Closing application/)	# Si "Closing application" est écrit dans une ligne
    				{
    				print $fh_txt "Le logiciel s'est correctement fermé\nLOG : $ligne\n\n";	# Ecrire dans le fichier Fonctionnement_SterEOS.txt
    				print "Le logiciel s'est correctement ferme\nLOG : $ligne \n\n";	# Ecrire dans la console
    				my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    				$end_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time
    				}
     
    				if (defined $end_time && $start_time)	# Si end_time existe 
    				{
    				my $temps = ($end_time) - ($start_time) if defined $end_time; # Calculer la valeur de temps
    				$temps = sprintf("%0.2f", $temps);	# Arrondir la valeur de temps avec 2 chiffres après la virgule
    				my $temps_heures = $temps/60;	# Calculer la valeur de temps_heures
    				$temps_heures = sprintf("%0.2f", $temps_heures);	# Arrondir la valeur de temps_heures avec 2 chiffres après la virgule 
    				print $fh_txt "Temps d'utilisation du logiciel : $temps minutes = $temps_heures heures\n\n\n";	# Ecrire dans le fichier Fonctionnement_SterEOS.txt
    				print "Temps d'utilisation du logiciel : $temps minutes = $temps_heures heures\n\n\n";	# Ecrire dans la console
    				}	
     
    			}
     
    	close($FIC);
    	close $fh_txt;	# Fermeture du fichier fh_txt
    	}
     
     
     
    <>;	# Pause
    Le programme n'a pas d'erreur et affiche en console 1 message comme celui - ci par fichier
    qu'il y a dans mon dossier C:\\Log\\test.
    ex :
    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
    Le logiciel s'est correctement ouvert
    LOG : 06/10/2014 | 10:09:09.062 | Starting 3D 
     
     
    Le logiciel s'est correctement fermé
    LOG : 06/10/2014 | 12:39:50.796 | Closing application
     
     
    Temps d'utilisation du logiciel : 30.69 minutes = 0.51 heures
    		.
    		.
    		.
    		.
    Le logiciel s'est correctement ouvert
    LOG : 06/19/2014 | 10:39:26.062 | Starting 3D 
     
     
    Le logiciel s'est correctement fermé
    LOG : 06/19/2014 | 12:07:03.796 | Closing application
     
     
    Temps d'utilisation du logiciel : 87.63 minutes = 1.46 heures
    Mais c'est bizarre car lorsque j'ouvre le fichier multiple_hip_log.txt censé contenir le même affichage
    que la console, il ne m'affiche que le dernier message comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Le logiciel s'est correctement ouvert
    LOG : 06/19/2014 | 10:39:26.062 | Starting 3D 
     
     
    Le logiciel s'est correctement fermé
    LOG : 06/19/2014 | 12:07:03.796 | Closing application
     
     
    Temps d'utilisation du logiciel : 87.63 minutes = 1.46 heures
    Vois tu ou est le problème ?

    Merci.

  5. #5
    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
    Tu ouvres (avec l'option ">" : donc en écrasant un fichier éventuellement déjà présent) le fichier $fichier_txt pour chaque élément dans la liste de fichier retournée par glob.
    Ainsi, tu ne stockes que les informations du dernier fichier.

    Soit :
    - tu ouvres ce fichier (et tu le fermes) en dehors de la boucle
    - tu ouvres le fichier avec l'option ">>" (sauf la première fois).

    De loin, il est préférable d'utiliser la première solution.
    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

  6. #6
    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
    Tu ouvres (avec l'option ">" : donc en écrasant un fichier éventuellement déjà présent) le fichier $fichier_txt pour chaque élément dans la liste de fichier retournée par glob.
    Ainsi, tu ne stockes que les informations du dernier fichier.

    Soit :
    - tu ouvres ce fichier (et tu le fermes) en dehors de la boucle
    - tu ouvres le fichier avec l'option ">>" (sauf la première fois).

    De loin, il est préférable d'utiliser la première solution.
    Ok merci sa marche nickel. Et est ce que tu aurais une solution qui me permetrait d'écrire le nom de chaque fichier avant l'affichage de chaque résultat comme ceux-ci (il y en a un par fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Le logiciel s'est correctement ouvert
    LOG : 06/10/2014 | 10:09:09.562 | Starting 3D 
     
     
    Le logiciel  s'est correctement fermé
    LOG : 06/10/2014 | 10:39:50.859 | Closing application
     
     
    Temps d'utilisation du logiciel : 30.69 minutes = 0.51 heures
    merci philou

  7. #7
    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
    Tu n'as qu'à écrire, après cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
    celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Ouverture du fichier $file\n";
    Ou alors j'ai pas bien compris
    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

  8. #8
    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
    Tu n'as qu'à écrire, après cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
    celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Ouverture du fichier $file\n";
    Ou alors j'ai pas bien compris
    Merci énormément pour ton aide !!!!!

  9. #9
    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 énormément pour ton aide !!!!!
    Philou, j'aurais encore besoin d'un petit peu d'aide.

    J'ai essayé la fonction glob avec mon programme perl qui tourne sur excel et je n'arrive pas à avoir le résultat que je souhaite.

    Mon code est le suivant
    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
     
     
    use strict;
    use warnings;
    use Spreadsheet::WriteExcel;
     
    my @files = glob ("C:\\Log\\3D_Trace*.log");
     
    my $workbook  = Spreadsheet::WriteExcel->new('C:\\Documents and Settings\\Fonctionnement.xls');	# Création du fichier excel
     
    	# Création des feuilles de calcul du workbook
    my $worksheet = $workbook->add_worksheet('Temps etude');
     
     
    # Créer un format pour les rubriques
    my $format = $workbook->add_format();
    $format->set_bold();
     
     
    foreach my $file (@files)
    	{
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
     
     
     
    while (my $ligne = <$FIC>)	# Début de la boucle while --> Lire chaque ligne du fichier fh_log
    {	
    		# Workflow de l'ouverture/fermeture du logiciel 
    	my $end_time;	# Initialisation de la variable end_time
    	my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;	# Initialisation des variables de l'heure
     
    	if ($ligne =~ /Starting 3D/)	# Si "Starting sterEOS 3D" est écrit dans une ligne
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$start_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60); # Calculer la valeur de start_time
    		}
    	elsif ($ligne =~ /Closing application/)	# Si "Closing application" est écrit dans une ligne
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$end_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time
    		}
    	if (defined $end_time)	# Si end_time existe 
    		{
    		my $temps = ($end_time) - ($start_time) if defined $end_time; # Calculer la valeur de temps
    		$temps = sprintf("%0.2f", $temps);	# Arrondir la valeur de temps avec 2 chiffres après la virgule
    		my $temps_heures = $temps/60;	# Calculer la valeur de temps_heures
    		$temps_heures = sprintf("%0.2f", $temps_heures);	# Arrondir la valeur de temps_heures avec 2 chiffres après la virgule 
     
    			# Ecriture dans la première feuille excel (worksheet)
    		$worksheet -> write(0,0,"Fichier $file",$format);
    		$worksheet -> write(2,0, "Temps total d'utilisation du logiciel :",$format);
    		$worksheet -> write(3,0,"$temps",$format);	
    		$worksheet -> write(3,1, 'minutes',$format);
    		$worksheet -> write(3,2, '---------->',$format);
    		$worksheet -> write(3,3, "$temps_heures", $format);
    		$worksheet -> write(3,4,'heures',$format);
    		}	
    }
    		close($FIC);
    }
     
    $workbook->close();
    Je souhaiterai obtenir dans une feuille de mon fichier excel un résultat comme celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Temps total d'utilisation du logiciel SterEOS :				
    30,69	minutes	---------->	0,51	heures
    ...
    ...
    Temps total d'utilisation du logiciel SterEOS :				
    20,69	minutes	---------->	0,34	heures
     
    ETC..
    Mais je n'obtient que ce résultat pour le dernier fichier de mon répertoire

    A tu une solution car ce n'est pas ma seule feuille sur excel et que ça me fait la même chose pour toute mes feuilles

    Merci.

  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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne suis pas entré dans le détail de ton code (c'est bien dans ce genre de cas de fournir un résumé aussi court que possible de ton code présentant le problème), mais il semble bien que pour chaque fichier en entrée, tu écrases ce qu'il y avait précédemment, si bien qu'à la fin tu n'as les résultats que pour le dernier fichier.

  11. #11
    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
    Je ne suis pas entré dans le détail de ton code (c'est bien dans ce genre de cas de fournir un résumé aussi court que possible de ton code présentant le problème), mais il semble bien que pour chaque fichier en entrée, tu écrases ce qu'il y avait précédemment, si bien qu'à la fin tu n'as les résultats que pour le dernier fichier.
    Salut

    Mon code extrait des lignes de plusieurs fichiers log d'un dossier. Et pour chaque fichier, il extrait la première et dernière ligne, celle ou staring 3D et closing application apparaissent. Ensuite il calcule le temps entre ces deux lignes et affiche le résultat sur excel.

    Je crois que tu as bien identifié le problème Lolo78 mais je ne sais pas comment le solutionner. Aurais-tu une solution ?

    Merci

  12. #12
    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
    Ce que dit lolo est vrai. Pour corriger, tu dois utiliser un offset pour tes lignes d'Excel afin que pour chaque nouveau fichier parcouru, les données que tu écris dans le fichier Excel soient décalées verticalement de la taille d'un bloc de ligne pour un fichier.

    Initialise cette offset à 0 avant la boucle qui parcours les fichiers, et incrément l'offset dans chaque traitement du "if ($end_time)" (incrémenté de la taille d'un bloc de lignes). Dans tes $worksheet -> write( ... ), ajoute l'offset au numéro de ligne.
    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

  13. #13
    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
    Ce que dit lolo est vrai. Pour corriger, tu dois utiliser un offset pour tes lignes d'Excel afin que pour chaque nouveau fichier parcouru, les données que tu écris dans le fichier Excel soient décalées verticalement de la taille d'un bloc de ligne pour un fichier.
    Merci, j'ai compris à quoi allait servir le offset, mais je ne sais pas comment l'initialiser. S'agit il d'une fonction ?
    Quand je fais des recherches, je tombe sur la fonction substr (). S'agit il de cela ?

    Initialise cette offset à 0 avant la boucle qui parcours les fichiers, et incrément l'offset dans chaque traitement du "if ($end_time)" (incrémenté de la taille d'un bloc de lignes). Dans tes $worksheet -> write( ... ), ajoute l'offset au numéro de ligne.
    J'ai écrit cela mais c'est peut être hors sujet car ça m'affiche le même résultat que précédement

    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
    use strict;
    use warnings;
    use Spreadsheet::WriteExcel;
     
    my @files = glob ("C:\\Log\\3D_Trace*.log");
     
    my $workbook  = Spreadsheet::WriteExcel->new('C:\\Documents and Settings\\Fonctionnement.xls');	# Création du fichier excel
     
    	# Création des feuilles de calcul du workbook
    my $worksheet = $workbook->add_worksheet('Temps etude');
     
     
    # Créer un format pour les rubriques
    my $format = $workbook->add_format();
    $format->set_bold();
     
     
    foreach my $file (@files)
    	{
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
     
     my $offset;
    $offset = 0;
     
     
    while (my $ligne = <$FIC>)	# Début de la boucle while --> Lire chaque ligne du fichier fh_log
    {	
    		# Workflow de l'ouverture/fermeture du logiciel 
    	my $end_time;	# Initialisation de la variable end_time
    	my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;	# Initialisation des variables de l'heure
     
    	if ($ligne =~ /Starting 3D/)	# Si "Starting sterEOS 3D" est écrit dans une ligne
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$start_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60); # Calculer la valeur de start_time
    		}
    	elsif ($ligne =~ /Closing application/)	# Si "Closing application" est écrit dans une ligne
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$end_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time
    		}
    	if (defined $end_time)	# Si end_time existe 
    		{
    		my $temps = ($end_time) - ($start_time) if defined $end_time; # Calculer la valeur de temps
    		$temps = sprintf("%0.2f", $temps);	# Arrondir la valeur de temps avec 2 chiffres après la virgule
    		my $temps_heures = $temps/60;	# Calculer la valeur de temps_heures
    		$temps_heures = sprintf("%0.2f", $temps_heures);	# Arrondir la valeur de temps_heures avec 2 chiffres après la virgule 
     
    			# Ecriture dans la première feuille excel (worksheet)
    		$worksheet -> write($offset+0,0,"Fichier $file",$format);
    		$worksheet -> write($offset+2,0, "Temps total d'utilisation du logiciel :",$format);
    		$worksheet -> write($offset+3,0,"$temps",$format);	
    		$worksheet -> write($offset+3,1, 'minutes',$format);
    		$worksheet -> write($offset+3,2, '---------->',$format);
    		$worksheet -> write($offset+3,3, "$temps_heures", $format);
    		$worksheet -> write($offset+3,4,'heures',$format);
    		my $offset = $offset + 6;
    		}	
    }
    		close($FIC);
    }
     
    $workbook->close();
    Merci de votre aide.

  14. #14
    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
    Par offset, j'entendais une variable (numérique) contenant une valeur d'offset (de décalage, ici, par rapport à zéro).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #...
    my $starting_point = 0;
    foreach my $file (@files) {
      print "Starting at ", $starting_point, "\n";
      # Code pour écrire un bloc de 10 lignes
      $worksheet->write($starting_point + 0, 0, "1ere ligne du fichier $file");
      $worksheet->write($starting_point + 1, 0, "2e ligne du fichier $file");
      # ...
      $starting_point += 10;
    }
    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

  15. #15
    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
    Par offset, j'entendais une variable (numérique) contenant une valeur d'offset (de décalage, ici, par rapport à zéro).
    J'ai essayé avec le code que tu m'a écrit mais j'ai toujours le même problème, c'est le message du dernier fichier qui s'affiche alors qu'il devrait en avoir une vingtaine avant . Je suis vraiment embêté car ça bloque toute la suite de mon projet.

    Voici mon 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
    use strict;
    use warnings;
    use Spreadsheet::WriteExcel;
     
    my @files = glob ("C:\\Trace*.log");
     
    my $workbook  = Spreadsheet::WriteExcel->new('C:\\Documents and Settings\\Fonctionnement.xls');	# Création du fichier excel
     
    	# Création des feuilles de calcul du workbook
    my $worksheet = $workbook->add_worksheet('Temps etude');
     
     
    # Créer un format pour les rubriques
    my $format = $workbook->add_format();
    $format->set_bold();
     
      my $offset;
    $offset = 0;
     
     
    foreach my $file (@files)
    	{
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
     
     my $start_time =0;	
     
    while (my $ligne = <$FIC>)	# Début de la boucle while --> Lire chaque ligne du fichier fh_log
    {	
    		# Workflow de l'ouverture/fermeture du logiciel 
    	my $end_time;	# Initialisation de la variable end_time
    	my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;	# Initialisation des variables de l'heure
     
    	if ($ligne =~ /Starting 3D/)	# 
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$start_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60); # Calculer la valeur de start_time
    		}
    	elsif ($ligne =~ /Closing application/)	# Si "Closing application" est écrit dans une ligne
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$end_time = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time
    		}
    	if (defined $end_time)	# Si end_time existe 
    		{
    		my $temps = ($end_time) - ($start_time) if defined $end_time; # Calculer la valeur de temps
    		$temps = sprintf("%0.2f", $temps);	# Arrondir la valeur de temps avec 2 chiffres après la virgule
    		my $temps_heures = $temps/60;	# Calculer la valeur de temps_heures
    		$temps_heures = sprintf("%0.2f", $temps_heures);	# Arrondir la valeur de temps_heures avec 2 chiffres après la virgule 
     
    			# Ecriture dans la première feuille excel (worksheet)
    		$worksheet -> write($offset+0,0,"Fichier $file",$format);
    		$worksheet -> write($offset+2,0, "Temps total d'utilisation du logiciel :",$format);
    		$worksheet -> write($offset+3,0,"$temps",$format);	
    		$worksheet -> write($offset+3,1, 'minutes',$format);
    		$worksheet -> write($offset+3,2, '---------->',$format);
    		$worksheet -> write($offset+3,3, "$temps_heures", $format);
    		$worksheet -> write($offset+3,4,'heures',$format);
    		my $offset = $offset + 6;
    		}	
    }
    		close($FIC);
    }
     
    $workbook->close();
    J'ai essayé en mettant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     my $offset;
    $offset = 0;
    avant le while et non le foreach mais cela ne change rien

    Vois -tu ou est le problème ?

  16. #16
    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
    Ton problème se situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $offset = $offset + 6;
    Tu redéfinis une nouvelle variable $offset locale à ta branche de if en utilisant le mot-clé my.
    Tu dois simplement écrire :
    Ou plus simplement :
    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

  17. #17
    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
    Ton problème se situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $offset = $offset + 6;
    Tu redéfinis une nouvelle variable $offset locale à ta branche de if en utilisant le mot-clé my.
    Tu dois simplement écrire :
    Ou plus simplement :
    Merci !!!! ça va me permettre de pouvoir avancer dans mon projet !

  18. #18
    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
    Désolé mais j'ai un nouveau problème que je n'arrive pas à arranger.

    J'ai a peu près le même programme que précédemment mais celui - la gère l'étude d'un paramètre qui est présent quelque fois plusieurs fois dans un fichier.

    Mon code est le suivant
    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
    use strict;
    use warnings;
    use Spreadsheet::WriteExcel;
     
    my @files = glob ("C:\\Log\\Trace*.log");
     
    my $workbook  = Spreadsheet::WriteExcel->new('C:\\Documents and Settings\\Fonctionnement.xls');	# Création du fichier excel
     
    	# Création des feuilles de calcul du workbook
    my $worksheet = $workbook->add_worksheet('Parameters');
     
     
    # Créer un format pour les rubriques
    my $format = $workbook->add_format();
    $format->set_bold();
     
     my $offset_parameters = 0;
     
     foreach my $file (@files)
    	{
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
     
     my $start_time_parameters = 0;	
     my $cpt_parameters_study = 0;
     my $temps_parameters = 0;
    my $temps_heures_parameters = 0;
     
    while (my $ligne = <$FIC>)	# Début de la boucle while --> Lire chaque ligne du fichier fh_log
    {	
    				# Workflow des paramètres pelviens 
    	my $end_time_parameters;	# Initialisation de la variable end_time_pelvic	
    	my $ligne_ecart1 = ($ligne =~ /Parameters workflow/) .. ($ligne =~ /Parameters created/);	 # Initialisation de la variable $ligne_ecart1 (lorsque deux mots à reconnaître ne sont pas sur la même ligne)
     
    	if ($ligne =~ /Parameters workflow/)	# Si "Pelvic parameters workflow" est écrit dans une ligne
    		{
    		$cpt_parameters_study++;	# Incrémentation du compteur
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$start_time_parameters = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de start_time_pelvic
    		}
    	if ($ligne_ecart1 =~ "E0")	# Test de validation des conditions de $ligne_ecart1 (Les deux messages peuvent avoir plusieurs lignes d'écart)
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$end_time_parameters = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time_pelvic
    		}
    	if (defined $end_time_parameters && $start_time_parameters)	# Si end_time_pelvic et start_temps_pelvic existe   
    		{
    		$temps_parameters = ($end_time_parameters) - ($start_time_parameters) if defined $end_time_parameters; # Calculer la valeur de temps_pelvic
    		$temps_parameters = sprintf("%0.3f", $temps_parameters);	# Arrondir la valeur de temps_pelvic avec 2 chiffres après la virgule
    		$temps_heures_parameters = $temps_parameters/60;	# Calculer la valeur de temps_heures_pelvic
    		$temps_heures_parameters = sprintf("%0.3f", $temps_heures_parameters);	# Arrondir la valeur de temps_heures_pelvic avec 2 chiffres après la virgule 
     
    		my $row = 0;	# ligne =0
    		$worksheet->write($offset_parameters+$row,0,"Fichier $file",$format);
    			# Ecriture dans la feuille excel
    		for($row = 3;$row<$cpt_parameters_study*4;$row+=3)	# Boucle for pour écrire chaque étude
    			{
     
    			$worksheet->write($offset_parameters+$row,0,"Etude num\xE9ro $cpt_parameters_study des param\xE8tres",$format);
    			$worksheet->write($offset_parameters+$row+1,0,"Temps :",$format); 
    			$worksheet->write($offset_parameters+$row+1,1,"$temps_parameters",$format);
    			$worksheet->write($offset_parameters+$row+1,2,"minutes",$format);
    			$worksheet->write($offset_parameters+$row+1,3,"---------->",$format); 
    			$worksheet->write($offset_parameters+$row+1,4,"$temps_heures_parameters",$format);
    			$worksheet->write($offset_parameters+$row+1,5,"heures",$format);
    			}	# Fin de la boucle for
    			$offset_parameters = $offset_parameters + ($cpt_parameters_study*5);
    			$row = $row + ($cpt_parameters_study*4);
    		}	
     
     
    }
    		close($FIC);
    }
     
    $workbook->close();


    Le résultat que j'obtien sur excel est le suivant
    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
    Fichier C:\Log\Trace_20140611_090131.log					
     
     
    Etude numéro 1 des paramètres 				
    Temps :	61,914	minutes	---------->	1,032	heures
    Fichier C:\EOS\Log\Trace_20140611_090131.log					
     
     
    Etude numéro 2 des paramètres 				
    Temps :	0,052	minutes	---------->	0,001	heures
     
    Etude numéro 2 des paramètres 					
    Temps :	0,052	minutes	---------->	0,001	heures
     
     
    Fichier C:\Log\Trace_20140611_100702.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	0,075	minutes	---------->	0,001	heures
    Fichier C:\Log\Trace_20140611_100702.log					
     
     
    Etude numéro 2 des paramètres 					
    Temps :	0,071	minutes	---------->	0,001	heures
     
    Etude numéro 2 des paramètres 					
    Temps :	0,071	minutes	---------->	0,001	heures
     
     
    Fichier C:\Log\Trace_20140611_100702.log					
     
     
    Etude numéro 3 des paramètres 					
    Temps :	0,052	minutes	---------->	0,001	heures
     
    Etude numéro 3 des paramètres				
    Temps :	0,052	minutes	---------->	0,001	heures
     
    Etude numéro 3 des paramètres 					
    Temps :	0,052	minutes	---------->	0,001	heures
     
     
     
     
    Fichier C:\Log\Trace_20140616_144318.log					
     
     
    Etude numéro 1 des paramètres 				
    Temps :	4,83	minutes	---------->	0,081	heures
    Fichier C:\Log\Trace_20140617_154345.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	1,089	minutes	---------->	0,018	heures
    Fichier C:\Log\Trace_20140617_154345.log					
     
     
    Etude numéro 2 des paramètres 					
    Temps :	0,859	minutes	---------->	0,014	heures
     
    Etude numéro 2 des paramètres					
    Temps :	0,859	minutes	---------->	0,014	heures
     
     
    Fichier C:\Log\Trace_20140618_132904.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	1,629	minutes	---------->	0,027	heures
    Fichier C:\Log\Trace_20140619_142704.log					
     
     
    Etude numéro 1 des paramètres 				
    Temps :	0,872	minutes	---------->	0,015	heures
    Alors que je suis censé obtenir ce résultat
    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
    Fichier C:\Log\Trace_20140611_090131.log					
     
     
    Etude numéro 1 des paramètres 				
    Temps :	61,914	minutes	---------->	1,032	heures
     
    Etude numéro 2 des paramètres 				
    Temps :	0,052	minutes	---------->	0,001	heures
     
     
    Fichier C:\Log\Trace_20140611_100702.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	0,075	minutes	---------->	0,001	heures
     
    Etude numéro 2 des paramètres 				
    Temps :	0,071	minutes	---------->	0,001	heures
     
    Etude numéro 3 des paramètres				
    Temps :	0,052	minutes	---------->	0,001	heures
     
     
    Fichier C:\Log\Trace_20140616_144318.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	4,83	minutes	---------->	0,081	heures
     
     
    Fichier C:\Log\Trace_20140617_154345.log					
     
     
    Etude numéro 1 des paramètres				
    Temps :	1,089	minutes	---------->	0,018	heures
     
    Etude numéro 2 des paramètres					
    Temps :	0,859	minutes	---------->	0,014	heures
     
     
    Fichier C:\Log\Trace_20140618_132904.log					
     
     
    Etude numéro 1 des paramètres					
    Temps :	1,629	minutes	---------->	0,027	heures
     
     
    Fichier C:\Log\Trace_20140619_142704.log					
     
     
    Etude numéro 1 des paramètres 					
    Temps :	0,872	minutes	---------->	0,015	heures
    Voyez-vous où est mon problème , peut être dans la boucle for et l'incrémentation de $offset_parameters et $row
    Mais je n'arrive pas à le résoudre.

    Merci de votre aide

  19. #19
    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
    Je ne pense pas que cela règle ton problème, mais la ligne 67
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row = $row + ($cpt_parameters_study*4);
    me semble totalement inutile.

    Ajoute des print dans ton code d'écriture des paramètres histoire de voir à quelle "row" tu écris dans la feuille Excel.
    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

  20. #20
    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 pense pas que cela règle ton problème, mais la ligne 67
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row = $row + ($cpt_parameters_study*4);
    me semble totalement inutile.

    Ajoute des print dans ton code d'écriture des paramètres histoire de voir à quelle "row" tu écris dans la feuille Excel.
    J'ai réussi à remédier à mon problème en enlevant la boucle for.

    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
    use strict;
    use warnings;
    use Spreadsheet::WriteExcel;
     
    my @files = glob ("C:\\Log\\Trace*.log");
     
    my $workbook  = Spreadsheet::WriteExcel->new('C:\\Documents and Settings\\Fonctionnement.xls');	# Création du fichier excel
     
    	# Création des feuilles de calcul du workbook
    my $worksheet = $workbook->add_worksheet('Parameters');
     
     
    # Créer un format pour les rubriques
    my $format = $workbook->add_format();
    $format->set_bold();
     
     my $offset_parameters = 0;
     
     foreach my $file (@files)
    	{
    	open (my $FIC, "<", $file) or die "ouverture impossible de $file $! \n";
     
     my $start_time_parameters = 0;	
     my $cpt_parameters_study = 0;
     my $temps_parameters = 0;
    my $temps_heures_parameters = 0;
     
    while (my $ligne = <$FIC>)	# Début de la boucle while --> Lire chaque ligne du fichier fh_log
    {	
    				# Workflow des paramètres pelviens 
    	my $end_time_parameters;	# Initialisation de la variable end_time_pelvic	
    	my $ligne_ecart1 = ($ligne =~ /Parameters workflow/) .. ($ligne =~ /Parameters created/);	 # Initialisation de la variable $ligne_ecart1 (lorsque deux mots à reconnaître ne sont pas sur la même ligne)
     
    	if ($ligne =~ /Parameters workflow/)	# Si "Pelvic parameters workflow" est écrit dans une ligne
    		{
    		$cpt_parameters_study++;	# Incrémentation du compteur
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$start_time_parameters = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de start_time_pelvic
    		}
    	if ($ligne_ecart1 =~ "E0")	# Test de validation des conditions de $ligne_ecart1 (Les deux messages peuvent avoir plusieurs lignes d'écart)
    		{
    		my($heure, $minute, $seconde, $milliseconde)=$ligne =~ /(\d\d):(\d\d):(\d\d).(\d\d\d)/;
    		$end_time_parameters = (((($heure * 60)+ $minute) *60 + ($seconde+($milliseconde/1000)))/60);	# Calculer la valeur de end_time_pelvic
    		}
    	if (defined $end_time_parameters && $start_time_parameters)	# Si end_time_pelvic et start_temps_pelvic existe   
    		{
    		$temps_parameters = ($end_time_parameters) - ($start_time_parameters) if defined $end_time_parameters; # Calculer la valeur de temps_pelvic
    		$temps_parameters = sprintf("%0.3f", $temps_parameters);	# Arrondir la valeur de temps_pelvic avec 2 chiffres après la virgule
    		$temps_heures_parameters = $temps_parameters/60;	# Calculer la valeur de temps_heures_pelvic
    		$temps_heures_parameters = sprintf("%0.3f", $temps_heures_parameters);	# Arrondir la valeur de temps_heures_pelvic avec 2 chiffres après la virgule 
     
    		$worksheet->write($offset_parameters,0,"Fichier $file",$format);
     
    			foreach ($cpt_parameters_study)
    			{
    			$worksheet->write($offset_parameters+1,0,"Etude num\xE9ro $cpt_parameters_study des param\xE8tres",$format);
    			$worksheet->write($offset_parameters+2,0,"Temps :",$format); 
    			$worksheet->write($offset_parameters+2,1,"$temps_parameters",$format);
    			$worksheet->write($offset_parameters+2,2,"minutes",$format);
    			$worksheet->write($offset_parameters+2,3,"---------->",$format); 
    			$worksheet->write($offset_parameters+2,4,"$temps_heures_parameters",$format);
    			$worksheet->write($offset_parameters+2,5,"heures",$format);
     
    		}
    				$offset_parameters = $offset_parameters + 6
     
     
    		}	
     
     
    }
    		close($FIC);
    }
     
    $workbook->close();
    Mais je n'arrive pas à améliorer mon résultat. j'obtient cela sur excel

    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
    Fichier C:\Log\Trace_20140428_130634.log					
    Etude numéro 1 des paramètres 					
    Temps	0,145	minutes	---------->	0,002	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130636.log					
    Etude numéro 1 des paramètres 					
    Temps	61,914	minutes	---------->	1,032	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130636.log					
    Etude numéro 2 des paramètres					
    Temps	0,052	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130633.log					
    Etude numéro 1 des paramètres					
    Temps	0,075	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130633.log					
    Etude numéro 2 des paramètres 					
    Temps	0,071	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130633.log					
    Etude numéro 3 des paramètres					
    Temps	0,052	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130639.log					
    Etude numéro 1 des paramètres 					
    Temps	4,83	minutes	---------->	0,081	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130640.log					
    Etude numéro 1 des paramètres					
    Temps	1,089	minutes	---------->	0,018	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130640.log					
    Etude numéro 2 des paramètres 					
    Temps	0,859	minutes	---------->	0,014	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130649.log					
    Etude numéro 1 des paramètres					
    Temps	1,629	minutes	---------->	0,027	heures

    Et je souhaiterais obtenir
    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
    Fichier C:\Log\Trace_20140428_130634.log					
    Etude numéro 1 des paramètres 					
    Temps	0,145	minutes	---------->	0,002	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130636.log					
    Etude numéro 1 des paramètres 					
    Temps	61,914	minutes	---------->	1,032	heures
     
    Etude numéro 2 des paramètres					
    Temps	0,052	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130633.log					
    Etude numéro 1 des paramètres					
    Temps	0,075	minutes	---------->	0,001	heures
     
    Etude numéro 2 des paramètres 					
    Temps	0,071	minutes	---------->	0,001	heures
     
    Etude numéro 3 des paramètres					
    Temps	0,052	minutes	---------->	0,001	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130639.log					
    Etude numéro 1 des paramètres 					
    Temps	4,83	minutes	---------->	0,081	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130640.log					
    Etude numéro 1 des paramètres					
    Temps	1,089	minutes	---------->	0,018	heures
     
    Etude numéro 2 des paramètres 					
    Temps	0,859	minutes	---------->	0,014	heures
     
     
     
    Fichier C:\Log\Trace_20140428_130649.log					
    Etude numéro 1 des paramètres					
    Temps	1,629	minutes	---------->	0,027	heures
    J'ai essayé avec une boucle for mais en vain.

    A tu une solution ?
    merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

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