p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    585
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 585
    Points : 36
    Points
    36

    Par défaut gestion des non erreurs dans un fichier

    Bonjour,

    Je souhaiterai réaliser un script qui m'ouvre un fichier dans le quel il y aurait différente ligne et ne récupérer que les lignes qui n'ont pas les mots suivants : erreur, error...

    Pour cela, j'avais pensé aux programme suivant :

    quel est la négation pour " =~ " ?


    open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

    my @GestionLigneExclu=("erreur","error");

    while ($Ligne = <FIC_READ> )
    {
    if (grep { $Ligne =~ m/$_/g } @GestionLigneExclu)
    {
    print "traitement $Ligne \n";
    }
    else
    {
    print "erreur $Ligne \n";
    }


    }
    close (FIC_READ);

  2. #2
    Membre émérite Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : septembre 2007
    Messages : 429
    Points : 859
    Points
    859

    Par défaut

    Salut,

    la négation pour ta regexp ( ne match pas ) est Cdlt.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    585
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 585
    Points : 36
    Points
    36

    Par défaut

    j'ai mis cela :


    open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

    my @GestionLigneExclu=("erreur","error");

    while ($Ligne = <FIC_READ> )
    {
    if (grep { $Ligne =~ m/$_/g } @GestionLigneExclu)
    {
    print "traitement $Ligne \n";
    }
    else
    {
    print "erreur $Ligne \n";
    }


    }
    close (FIC_READ);
    malgré cela, les lignes contenant le mot erreur apparaissement dans la premier condition "Traitement $Ligne".

    Merci pour votre aide

  4. #4
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    585
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 585
    Points : 36
    Points
    36

    Par défaut

    pardon , je voulais dire :

    open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

    my @GestionLigneExclu=("erreur","error");

    while ($Ligne = <FIC_READ> )
    {
    if (grep { $Ligne !~ m/$_/g } @GestionLigneExclu)
    {
    print "traitement $Ligne \n";
    }
    else
    {
    print "erreur $Ligne \n";
    }


    }
    close (FIC_READ);

  5. #5
    Membre émérite Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : septembre 2007
    Messages : 429
    Points : 859
    Points
    859

    Par défaut

    As tu essayer de printer dans ta boucle pour voir ce que ça donne comme ceci :

    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
    open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";
     
    my @GestionLigneExclu=("erreur","error");
     
    while ($Ligne = <FIC_READ> ) {
        if (grep { $Ligne !~ m/$_/g } @GestionLigneExclu){ 
            print "traitement $Ligne for : $_ \n";
    }
    else{
        print "erreur $Ligne \n";
    }
     
     
    } 
    close (FIC_READ);
    et puis la syntaxe utilisée j'avoue , j'en suis pas fan (passage de tableau à un grep comme ceci )

  6. #6
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 698
    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 : 1 698
    Points : 4 459
    Points
    4 459
    Billets dans le blog
    1

    Par défaut

    Suppose que $Ligne contienne: "erreur toto titi", avec @GestionLigneExclu=("erreur","error");

    Ton "grep { $Ligne !~ m/$_/g } @GestionLigneExclu) " va te renvoyer "error", puisque error n'est pas dans ta ligne. Du coup, en contexte scalaire, ce sera évalué à 1 (un élément retournée par le grep) et, par conséquent, le if considérera la condition comme étrant vraie.
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  7. #7
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    585
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 585
    Points : 36
    Points
    36

    Par défaut

    A partir du moment ou je mets cela dans un tableau, avec plusieurs valeurs, ça ne fonctionne pas.

    La commande suivante ci-dessous fonctionne : par contre je ne peux mettre qu'une référece dans ma variable $toto.
    Comment pourrais je avoir plusieures référence,

    comme my $toto="erreur, fatal, ERROR";

    my $toto="erreur";
    if ($Ligne !~ m/$toto/ ) {
    print "on affiche la ligne\n";
    }
    else
    {
    print "on affiche rien\"n;
    }



  8. #8
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 698
    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 : 1 698
    Points : 4 459
    Points
    4 459
    Billets dans le blog
    1

    Par défaut

    Si tu mets tes différents mots disgnostics d'erreur dans un tableau, par ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @error_msg = qw /erreur error fatal failed coredump/;
    tu n'as pas trop d'autre choix que de tester chacun des éléments du tableau sur chaque ligne. Par exemple quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (my $ligne = <$FIC_READ>) {
         foreach my $pattern (@error_msg) {
              print "erreur sur ligne $.\n" if $ligne =~ /$pattern/;
         }
    }
    Tu peux aussi faire un grep (positif, pas négatif, pour la raison exposée dans mon post précédent), ça te donnera l'impression de ne pas faire un truc aussi inefficace que deux boucles imbriquées, mais ça ne change pas grand chose à la réalité des choses (en sous-jacent, il y aura bien deux boucles impriquées). Pas testé, mais un truc comme cela devrait marcher à peu près, je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (my $ligne = <$FIC_READ>) {
               print "erreur sur ligne $.\n" if (grep { $ligne =~ /$_/} @error_msg);
    }
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  9. #9
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    585
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 585
    Points : 36
    Points
    36

    Par défaut

    en effet, ça fonctionne mieux.

    Mais si dans ma variable, je fais une recherche sur des mots avec des espaces., ça ne fonctionne pas !!

    my @error_msg = qw /erreur error fatal failed coredump/;

    par exemple, je recherche "erreur du programme", je recherche la pharse entiere.

    merci pour votre aide

  10. #10
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 698
    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 : 1 698
    Points : 4 459
    Points
    4 459
    Billets dans le blog
    1

    Par défaut

    Si tu recherches des expression contenant plusieurs mots, il faut remplacer la syntaxe qw:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @error_msg = qw /erreur error fatal failed coredump/;
    par celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @error_msg = ("fatal error", "erreur de lecture du fichier", "Programme arrêté par la fin du monde le 21/12/2012");
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

Discussions similaires

  1. Récupérer des réels non NaN dans un fichier
    Par jyloup dans le forum Fortran
    Réponses: 8
    Dernier message: 05/12/2012, 08h31
  2. Configuration des erreur dans un fichier ini
    Par Jcpan dans le forum MVC
    Réponses: 10
    Dernier message: 22/09/2012, 00h55
  3. Dernière ligne non vide, dans un fichier contenant des plans.
    Par Faelucc dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/07/2010, 13h27
  4. Détection des erreurs dans un fichier texte (txt)
    Par M E H D I dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/05/2010, 10h14
  5. [C#] Comment serializer l'écriture des erreurs dans un fichier
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/11/2006, 14h54

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