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 :

gestion des non erreurs dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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 éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 876
    Points
    876
    Par défaut
    Salut,

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

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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 éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 876
    Points
    876
    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
    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
    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.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    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
    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);
    }

  9. #9
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    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
    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");

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