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 :

Recherche dans un fichier impossible enregistré dans un fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Par défaut Recherche dans un fichier impossible enregistré dans un fichier
    Bonjour à tous,

    je fais un script qui dois recherché dans les fichiers d'un dossier et ses sous dossiers le contenu qui correspond a ce que l'utilisateur cherche.
    J'ai déjà fais un script qui fonctionne le problème c'est qu'il marche comme ca :

    (au préalable je demande le dossier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    print "Veuillez entrer le message d'erreur que vous voulez rechercher : ";
    chomp(my $exp = <STDIN>);
    sub recherche {;
      if (-f){
        print "**** FICHIER CONTENANT UNE ERREUR ****\n
        $File::Find::dir/$_\n"
        if grep { /$exp/ } `cat $_`; 
      }
    }

    Mon problème ici est le grep puis l'affichage via un cat, j'aimerais que ca s'enregistre dans un fichier .Txt directement (qui n'existe pas)

    je ne sais pas comment faire ? j'ai essayé avec un print mais K.O


    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 : 59
    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
    Par défaut
    Je crois qu'il manque ceci à la fin du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find(\&recherche,"$path");
    Pour remplacer le `cat $_`, il faut :
    - ouvrir le fichier $_ : open my $F, "<", $_;
    - effectuer le grep sur la lecture de son contenu : print "ERROR found" if grep /$exp/, <$F>;

    Cela dit, une chaine de caractère lue au clavier ne devrait pas être utilisée "telle quelle" comme expression régulière. Par exemple, si l'utilisateur tape un ".", celui-ci sera interprété comme "n'importe quel caractère". Si c'est bien ce qui est désiré, alors pas de soucis, sinon, utiliser la fonction quotemeta.

    Enfin, s'il s'agit d'une recherche d'une simple chaine, sans besoin d'expression régulière, il est préférable d'utiliser la fonction index qui retourne un indice de sous-chaine dans une chaine, ou -1 en cas d'échec.

  3. #3
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Par défaut
    Oui le code y était bien :p

    mon code actuel complet est :

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::Find;
     
    print "Veuillez entrer le chemin du dossier : ";
    chomp(my $path = <STDIN>);
     
     
    #Le chemin du fichier config.cfg est passé en paramètre par l'utilisateur
    print "Veuillez entrer le message d'erreur que vous voulez rechercher : ";
    chomp(my $exp = <STDIN>);
    print "Fichier(s) contenant le mot '$exp':\n";
     
    sub recherche {;
      if (-f){
        print  "$File::Find::dir/$_\n"
        if grep { /$exp/ } `cat $_`;
     
     
      }
    }
     
    find(\&recherche,"$path");
    print "*** Recherche terminee ***";
    __END__

    Oui le code ne dois pas être parfait et meme si l'utilisateur tape "." cela recherchera.
    Par contre je comprend pas très bien ce que tu m'explique et comment l'appliqué surtout.
    Je cherche a enregistrer dans un fichier .txt

  4. #4
    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 : 59
    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
    Par défaut
    Je t'ai montré comment écrire le résultat, donc lorsque tu lances le script tu peux simplement le faire en précisant que le résultat doit aller dans un fichier texte :
    perl script.pl >resultat.txt

    Si tu tiens à écrire le fichier directement depuis le script, ouvre alors un fichier en écriture en début de script, et utilise le File Handle pour écrire ton résultat (le print "ERROR found" notamment).

    Écris ce que tu penses avoir compris et montre nous le résultat.

  5. #5
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Par défaut
    Ca fonctionne pas mais j'ai pas d'erreur j'ai peut être mal compris

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::Find;
     
    print "Veuillez entrer le chemin du dossier : ";
    chomp(my $path = <STDIN>);
     
     
    #Le chemin du fichier config.cfg est passé en paramètre par l'utilisateur
    print "Veuillez entrer le message d'erreur que vous voulez rechercher : ";
    chomp(my $exp = <STDIN>);
    print "Fichier(s) contenant le mot '$exp':\n";
    my $F="resultat.txt";
    sub recherche {;
      if (-f){
        print  "$File::Find::dir/$_\n"
        if grep { /$exp/ } `cat $_`;
        open my $F, ">>", $_;
        print "ERREUR found" if grep /$exp/, <$F>;
     
      }
    }
     
    find(\&recherche,"$path");
    print "*** Recherche terminee ***";
    __END__
    Donc la j'ai déclaré le $F en résultat.txt après mon grep j'ouvre mon $F et j'ajoute avec ">>" le contenu de $_
    Vu que ca fonctionne pas j'ai du très mal comprendre ?

  6. #6
    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 : 59
    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
    Par défaut
    Là, tu confonds le file handle du fichier dans lequel tu fais une recherche (avec grep), qui doit être ouvert EN LECTURE (et non en écriture comme tu l'as fait, ce qui risque de t'effacer tous tes fichiers), et le handle du fichier de sortie, qu'il faut ouvrir en écriture une seule fois avant l'appel à la fonction find.

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

Discussions similaires

  1. [XL-2010] Créer 1 fichier xls à enregistrer dans un répertoire "relatif"
    Par olo-rsv-R dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/06/2011, 23h44
  2. [MySQL] Analyser gros fichier XML, enregistrement dans une table MySQL
    Par bunsky dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 20/12/2010, 14h49
  3. [RegEx] Rechercher des éléments et les enregistrés dans un tableau
    Par arnaudperfect dans le forum Langage
    Réponses: 4
    Dernier message: 21/03/2010, 22h41
  4. Réponses: 3
    Dernier message: 13/08/2009, 00h44
  5. Réponses: 8
    Dernier message: 08/08/2008, 11h19

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