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 :

For qui sort après le premier enregistrement trouvé


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 27
    Points
    27
    Par défaut For qui sort après le premier enregistrement trouvé
    Bonjour à tous

    j'ai un script qui devrait parcourir un fichier, mais il s’arrête des-qu’il trouve le premier enregistrement satisfaisant la première condition, alors que d'autres lignes du fichier sont valables aussi.
    Les prints me servent de debug.
    Pouvez vous m'aider

    Merci

    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
     
    open( FIC, $fic);			# ouvre le fichier de la liste des postes sauvegardés
        chomp(@list = <FIC>);
        close(FIC);
        $nb=@list;
     
    	for ( $a=0; $a<$nb; $a++ )
    	             {
    			print "$a.$nb \n";
                            @list2=split(";" , $list[$a]);
     
    				$nomrep = $list2[1];		# Recupere le nom du poste sauvegarde
    				#print "$list2[1] \n";
    					if ( $list2[0] == $wd ) 	# Teste si le n° du jour dans le fichier est = au jour du controle
    						{
    						if ( $list2[2] > "8" )	# Si l'heure de la sauvegarde est superieure à 8h alors prendre le fichier de la veille
    							{
    						$nomlog = "\\log $dv.txt";
    						print "$nomlog \n";		
    						controlelog($nomrep,$nomlog,$list2[3]);
    							}
    						else					# Sinon prendre le fichier du jour
    							{
    						$nomlog = "\\log $dj.txt";
    						print "$nomlog \n";
    						controlelog($nomrep,$nomlog,$list2[3]);
    							}
    						}
     
    			}

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Je te conseille quand tu traites un fichier de le faire au fil de l'eau et non de charger tout ton fichier dans un array, ça donnerait quelque chose comme ce qui suit (pas testé):
    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
    use strict;
     
    open( FIC, $fic);			# ouvre le fichier de la liste des postes sauvegardés
    while (<FIC>){
    	if ( $_ =~ /^\s*(\d+);([^;]);(\d+);([^;])/ ){
    		my $numjour  = $1;
    		my $nomrep   = $2;
    		my $heuresav = $3;
    		my $chSuiv    = $4;
     
    		if ( $numjour == $wd ){
    			if ( $heuresav > 8 ){
    				$nomlog = "\\log $dv.txt";
    				print "$nomlog \n";		
    				controlelog($nomrep,$nomlog,$chSuiv);
    			}
    			else{
    				$nomlog = "\\log $dj.txt";
    				print "$nomlog \n";
    				controlelog($nomrep,$nomlog,,$chSuiv);
    			}
    		}
    	}
    }
    Par contre cette réécriture ne doit pas résoudre ton problème de sortie au 1er tour. Pourrais-tu mettre ta fonction "controlelog"? car je pense que c'est là qu'il y a une sortie intempestive

    Sinon, tu devais faire attention aux noms des fichiers et éviter de mettre des espaces car c'est source à problème.
    autre erreur je pense dans ton code: if ( $list2[2] > "8" ) -> si tu compares des String, tu n'auras pas le même comportement de comparaison
    ex: 10 > 8 en chiffre MAIS 10 < 8 en String

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    j ai joint 2 fichiers, le premier est le programme et le 2 èmè est le fichier des postes à analyser.
    Pour ce qui est du nom de log il est généré par un soft, c'est pour cela qu'il y a un blanc dans le nom.
    Je teste les modifications conseillées
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    je vais regarder mais la 1ère chose à changer dans tous tes codes et d'ajouter le "use strict" car ça te permettra de debugger plus facilement
    et ça va t'obliger à faire un code beaucoup plus propre avec des déclarations systématiques des variables

    j'ai testé mon code ci-dessus et ça à l'air OK:
    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
    use strict;
     
    my ($wd, $nomlog, $dv, $dj) = (1, '', 99, 77);
    open( FIC, 'postes-bpx-test.txt') or die "pas open\n";			# ouvre le fichier de la liste des postes sauvegardés
    while (<FIC>){
    	if ( $_ =~ /^\s*(\d+);([^;]+);(\d+);([^;]+)/ ){
    		my $numjour  = $1;
    		my $nomrep   = $2;
    		my $heuresav = $3;
    		my $chSuiv   = $4;
     
    		if ( $numjour == $wd ){
    			if ( $heuresav > 8 ){
    				$nomlog = "\\log $dv.txt";
    				print "$nomlog \n";		
    				#controlelog($nomrep,$nomlog,$chSuiv);
    			}
    			else{
    				$nomlog = "\\log $dj.txt";
    				print "$nomlog \n";
    				#controlelog($nomrep,$nomlog,,$chSuiv);
    			}
    		}
    	}
    }
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    \log 99.txt
    \log 99.txt
    j'ai pas trop le temps cet après-midi mais je regarderai plus tard la partie "controlelog"

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    J ai suivi tes conseilles et ai modifié le script.
    Effectivement si on désactive le controlelog ça fonctionne, affaire à suivre

    Merci

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Bon voilà ton code corrigé avec le use strict et donc la déclaration de toutes tes variables => code bien formé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    ##### Recupere le log des sauvegardes des postes validés
    #!/usr/bin/perl
     
    use Time::Local;
    #use Mail::Sender;
    use File::Copy;
     
    use strict;
     
    system ( "net use Z: /DELETE" );
    system ( "net use Z: \\\\serveur\\partage" ); # partage où sont les log des differents postes à analyser
     
     
    my $repm="z:\\";
    my $Liste_postes="c:\\scripts\\exploit\\bpx\\postes-bpx-test.txt"; #Dans ce fichier figure les jours du controle des sauvegardes
     
     
    my ($Week_Day,$datejour,$dateveille)=caldate();
     
    my $wd=$Week_Day;
    my $dj=$datejour;
    my $dv=$dateveille;
    my $fic=$Liste_postes;
     
    open( FIC, 'postes-bpx-test.txt') or die "pas open\n";			# ouvre le fichier de la liste des postes sauvegardés
    while (<FIC>){
    	if ( $_ =~ /^\s*(\d+);([^;]+);(\d+);([^;]+)/ ){
    		my $numjour  = $1;
    		my $nomrep   = $2;
    		my $heuresav = $3;
    		my $chSuiv   = $4;
    		my $nomlog;
     
    		if ( $numjour == $wd ){
    			if ( $heuresav > 8 ){
    				$nomlog = "\\log $dv.txt";
    				print "$nomlog \n";		
    				#controlelog($nomrep,$nomlog,$chSuiv);
    			}
    			else{
    				$nomlog = "\\log $dj.txt";
    				print "$nomlog \n";
    				#ontrolelog($nomrep,$nomlog,,$chSuiv);
    			}
    		}
    	}
    }
     
     
    # Calcul sur le date  ##########################################################
    ################################################################################
    sub caldate
    {
    # Calcul de la date du jour AAAAMMJJ
    #@jour = ('0', '1', '2', '3', '4', '5', '6');
    my @jour = ('Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam');
     
    my ($Sec,$Min,$Hour,$Day,$Month,$Year,$Week_Day) = localtime(time);
    $Year += 1900;
    $Month++;
    if ($Day < 10)
    {
    $Day= "0$Day";
    }
    my $datejour = $Year.$Month.$Day ;
     
    # Calcul de la date de la veille AAAAMMJJ
     
    my ($sec, $min, $heure,$jour, $mois,$annee) = localtime(time-3600*24);
    $annee += 1900;
    $mois++;
    if ($jour < 10)
    {
    $jour= "0$jour";
    }
    my $dateveille = $annee.$mois.$jour ;
     
    return ($Week_Day,$datejour,$dateveille)    # retourne le N° du jour la date du jour et la date de la veille
     
    }
     
     
    # Controle le presence du fichier Log ######################################################
    ###############################################################################
    sub controlelog
    {
    my $etat=0;
    my $nb=0;
    my $replog = $_[0];
    my $ficlog = $_[1];
    my $dest = $_[2];
    my $log="$repm\\$replog\\Logs$ficlog";
    my $log1="$repm\\$replog\\Logs$ficlog";
    my $decode="$repm\\$replog\\Logs\\decode.txt";
     
     
    print "$repm\\$replog\\Logs$ficlog \n";
     
    if ( -e "$log" )			# Teste si le fichier devant etre analyse est present
    {
    $log1 =~ s/\s+//g;			# Supprime le blanc dans le nom du log
     
     
    copy("$log","$log1"); 		# Copie le fichier source dans le fichier sans espace dans le nom 
     
     
    system ( "type  $log1 > $decode" ); # Le converti en ansi 
    unlink $log1;
    analyselog($decode,$dest,$replog);
    }
    else
    {
    system ( "net use Z: /DELETE" );
    print "$repm\\$replog\\Logs$ficlog introuvable\n";
    my $msg = "Bonjour,
     
    	Les sauvegardes sur le poste $replog ne se sont pas exécutées.
     
    	Fichier LOG non trouvé.
     
    	Veuillez vérifier que le poste est allumé.
     
    	Bonne journée";
     
    	#courriel($dest,$msg);
    }
    }
    #Analyse du fichier Log ######################################################
    ###############################################################################
     
    sub analyselog
    {
    my $log=$_[0];
    my $dest=$_[1];
    my $poste=$_[2];
     
    open( LOG, "$log" );
    print $log ;
    my $mess="Voici les lignes en erreur dans la sauvegarde du poste $poste \n\n";
    while ( <LOG> ){
    	if ($_ =~ /^\s*ERR/ ){                 # recherche ligne commençant par ERR avec éventuellement 1 ou plusieurs espace(s) avant
    		$mess .= "$_" ;
    	}
    }
    close LOG;	
    	unlink $log;
    	system ( "net use Z: /DELETE" );
    	#courriel($dest,$mess); 
    }
    avant de tester, après avoir récupéré le code ci-dessus, tape la commande: perl -c Fichier.pl pour (pour être sûr de ne pas avoir de problème de copier/coller

    Essaie de réactiver "controlelog" en désactivant "analyselog" => que ce passe-t-il? quels sont tes prints? quels messages d'erreurs?
    si OK, réactive "analyselog" => même questions

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    C'est OK

    Par contre j'ai comparé les blocs controlelog et analyselog entre ton script et le mien et n'ai pas trouvé de différence à part les "my".

    Qu'est ce qui fait, que maintenant ça fonctionne.

    Merci

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par laurent33500 Voir le message
    C'est OK

    Par contre j'ai comparé les blocs controlelog et analyselog entre ton script et le mien et n'ai pas trouvé de différence à part les "my".
    c'est normal car c'est la seule chose que j'ai modifié
    Citation Envoyé par laurent33500 Voir le message
    Qu'est ce qui fait, que maintenant ça fonctionne.

    Merci
    Je pense que le fait que tes variables ne soient pas correctement déclarées devait entrainer un effet de bord.

    Pour tes prochains codes, commence par utiliser le use strict, tu verras c'est plus propre et ça aide beaucoup

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Merci pour le conseil et pour ton aide

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    J'ajouterais que tout script de plus de deux lignes devrait avoir ces deux "pragmas":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    J'ai expliqué les raisons en détail dans ma FAQ sur le débogage en Perl, je ne les répéterai donc pas ici.

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

Discussions similaires

  1. Boucle repeat qui s'arrête au premier enregistrement
    Par Esprit Jeu dans le forum SQL Procédural
    Réponses: 22
    Dernier message: 25/05/2011, 08h48
  2. [AC-2003] dlookup qui bloque sur le premier enregistrement
    Par chuspyto dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/02/2010, 09h37
  3. Réponses: 116
    Dernier message: 05/02/2010, 10h07
  4. Select qui retourne le premier enregistrement
    Par vladimire dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 28/05/2009, 13h47
  5. [MySQL] Prendre les 2 premiers enregistrements après un tri
    Par Steph21 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/02/2008, 20h53

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