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 un mot dans un ensemble des fichiers


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Recherche un mot dans un ensemble des fichiers
    Bonsoir ,
    Je débute en perl , en fait je dois chercher un mot donné dans un ensemble des fichier par la suite afficher le nom du premier fichier contenant ce mot ainsi que le titre de ce fichier, le programme doit terminer dès qu'il trouve la premiere occurrence de mot donné... est ce quelq'un peut m'aider , j'ai cherché mais j'arrive toujours pas à resoudre le probleme..
    En attendant merci beaucoup.

  2. #2
    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
    Bonsoir,

    as-tu essayé quelque chose? C'est en général plus facile de corriger un essai de code ne fonctionnant pas que de proposer une solution qui ne correspondra sans doute pas au besoin, parce que sa description n'est pas assez détaillée.

    Par exemple, tu dis que le programme doit s'arrêter dès qu'il a trouvé le premier fichier contenant le mot voulu. Cela semble indiquer que les noms de fichiers seront fournis dans un ordre donné bien spécifique. Sous quelle forme?

    D'une façon générale, ton programme doit fonctionner à deux niveaux:
    - parcourir la liste de fichiers en entrée;
    - pour chacun des fichiers en entrée, rechercher le mot et s'arrêter dès qu'il est trouvé.

    Mais il faudrait plus de détails (et des exemples) pour transformer cet algorithme théorique en programme.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut
    bonjour et merci pour la réponse ,
    j'ai fait ce code mais il semble qu'il ya un pblme au niveau de la lecture dans les fichiers...

    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
     
     
    use strict;
    use warnings;
    use diagnostics;
    use utf8;
    use autodie;
    use File::Spec;	
    use CGI::Carp 'fatalsToBrowser';
     
    my $dir = "/home/dossier";
     
    my @listeFichiersMem;
     
     
     
    #open my $FIC1, "<", $file1 or die "Can't open $file1 for reading: $!";
    # read all entries in the directory:
    opendir DIR, $dir or die "Cannot open $dir $!";
    @listeFichiersMem = grep { !/^\.\.?$/ } readdir DIR;
     
     
     
     
    my @sorted = sort @listeFichiersMem;
     
     my $size = @listeFichiersMem;
     
    my $mot="pomme";
     
     foreach my $File  (@sorted) {
     
    	#print "$File\n"; $File est le nom de fichier
     
            open my $FIC, "<", "$dir/$File" or die "!!!!Can't open $File for reading!!!!";
     
     
    my @tab = <FIC>;
    my $sizeTab = $#tab+1; 
     print $sizeTab; print "\n";
    for (my $i = 0; $i < $sizeTab; $i++)
    {
    	chomp();
    	chomp($tab[$i]);
    	chomp($mot);
     
    	if($tab[$i] eq $mot)
     
    {
    print "le mot $mot existe dans le fichier $File"; print "\n";
     
    }
    else
    {
    print "erreur";
    }
     
    }
     
     
     
     
    }
        print $size; print "\n";

  4. #4
    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
    Bonjour,

    voici un exemple adapté de ton code qui marche chez moi:

    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;
    use warnings;
    use diagnostics;
    use utf8;
    use autodie;
    use File::Spec;	
     
    my $dir = ".";
     
    opendir my $DIR, $dir or die "Cannot open $dir $!";
    my @listeFichiersMem = grep -f, readdir $DIR;
     
    my @sorted = sort @listeFichiersMem;
    my $mot = "sub";
     
    LOOP1: foreach my $File  (@sorted) {
        open my $FIC, "<", "$dir/$File" or die "!!!!Can't open $File for reading!!!!";
        while (my $line = <$FIC>) {
            if ($line =~ /$mot/) {
                print "$File: $line";
                last LOOP1;
            }
        }
    }
    Note que j'ai mis un "grep -f" dans la ligne de lecture du contenu du répertoire, pour ne garder que des fichiers dans @listeFichiersMem (et exclure en particulier les répertoires). Du coup, l'autre grep pour exclure "." et ".." n'est plus utile.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut
    j'ai testé le programme mais il n'affiche rien comme resultat

  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
    Chez moi, ça marche.

    Il te faut bien sûr adapter le chemin du répertoire, le mot recherché, etc., à ton cas de figure spécifique.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut
    j'ai juste chagé le chemin de mon dossier , il y a un problème dans l'ouverture des fichiers en lecture
    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
     
     
     
     
    #
    # GetFilesList - Renvoie la liste des fichiers d'un repertoire (en mode recursif)
    #
    sub GetFilesList
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$FileFound") );
                    }
     
            }
            return @FilesList;
    }
     
    #
    # Boucle principale
    #
    my $mot="fruit";
    chomp($mot);
     
    my @Files = GetFilesList ("/home/lenovo/Bureau/dossier");
    	my @sorted = sort @Files;
     
     
     
    LOOP1: foreach my $File  (@sorted) {
        open my $FIC, "<", "$dir/$File" or die "!!!!Can't open $File for reading!!!!";
     
        while (my $line = <$FIC>) {
    		chomp($line);
            if ($line =~ /$mot/) {
                print "$File: $line"; print "ok"; print "\n";
                last LOOP1;
            }
     
        }
    }

  8. #8
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut
    le problème est résolu quand je remplace grep -f par grep { !/^\.\.?$/ } , savez vous pkoi ?

  9. #9
    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 veux parcourir récursivement le répertoire, alors il ne faut pas faire de grep -f au moment de la lecture du répertoire puisque ça élimine d'entrée de jeu tous les sous-répertoires que tu ne pourras donc pas explorer.

    Mais il me semble que ton appel récursif de la fonction GetFilesList ne doit pas fonctionner correctement, car tu lui passes un chemin incomplet. Il faudrait lui passer "$Path/$FileFound", et pas seulement "$FileFound".

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

Discussions similaires

  1. [Batch] rechercher un mot dans un fichier
    Par apetroff dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 11/12/2009, 15h18
  2. Réponses: 2
    Dernier message: 28/08/2009, 14h15
  3. [batch] Comment rechercher deux mots dans un fichier .txt ?
    Par koKoTis dans le forum FAQs Windows
    Réponses: 0
    Dernier message: 10/02/2009, 17h54
  4. Recherche de mot dans un fichier
    Par Bennybear dans le forum C++
    Réponses: 6
    Dernier message: 23/03/2007, 20h12
  5. Module de recherche de mots dans plusieurs fichiers
    Par hat_et_m dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/09/2006, 20h09

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