Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    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 chevronné Avatar de messinese
    Homme Profil pro Jean-marie Bourbon
    IT Security Consultant
    Inscrit en
    septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-marie Bourbon
    Âge : 32
    Localisation : France, Aude (Languedoc Roussillon)

    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 : 791
    Points
    791

    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
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    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
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    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 chevronné Avatar de messinese
    Homme Profil pro Jean-marie Bourbon
    IT Security Consultant
    Inscrit en
    septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-marie Bourbon
    Âge : 32
    Localisation : France, Aude (Languedoc Roussillon)

    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 : 791
    Points
    791

    Par défaut

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

    Code :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    991
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 991
    Points : 1 946
    Points
    1 946

    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.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    991
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 991
    Points : 1 946
    Points
    1 946

    Par défaut

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

    Code :
    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 :
    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 :
    1
    2
    3
    while (my $ligne = <$FIC_READ>) {
               print "erreur sur ligne $.\n" if (grep { $ligne =~ /$_/} @error_msg);
    }
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    991
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 991
    Points : 1 946
    Points
    1 946

    Par défaut

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

    Code :
    my @error_msg = qw /erreur error fatal failed coredump/;
    par celle-ci:

    Code :
    my @error_msg = ("fatal error", "erreur de lecture du fichier", "Programme arrêté par la fin du monde le 21/12/2012");
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •