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 :

Extraire chaînes de textes de documents d'un répertoire


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Extraire chaînes de textes de documents d'un répertoire
    Bonjour à tous,

    Je débute en Perl et je cherche à faire un programme qui demanderait à l'utilisateur un mot à rechercher et qui chercherait ce mot dans tous les fichiers d'un répertoire. Une fois ce mot trouvé, il afficherait toutes les phrases contenant ce mot dans un nouveau fichier texte.

    J'ai essayé quelque chose mais je ne suis même pas sûre que ça veuille dire quelque chose.

    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
    #! /usr/bin/perl -w
     
    open (OUT, ">resultat_out.txt") ;
     
    print "Entrez un terme à rechercher" ;
    $recherche = <STDIN> ;
    opendir(REP,"C:\Users\User\Dossier\Dossier_test");
     
    while ($file = readdir (REP)) {
    if ($file=~/[A-Z]<STDIN>\./) {
    $mot=$1;
    print OUT $mot;
    }
    }
     
    closedir(REP) ;
    close(OUT);
    Avec ce code j'ai ce message d'erreur : "readdir() attempted on invalid dirhandle REP at recherche.pl line 9, <STDIN> line 1.
    closedir() attempted on invalid dirhandle REP at recherche.pl line 16, <STDIN> line 1."

    Quelqu'un peu m'aider à comprendre et m'aiguiller pour la suite ?

    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,

    le problème principal provient certainement du chemin du répertoire: utilise soit des barres obliques normales ("/"), soit des barres obliques inversées doublées ("\\"), parce que le caractère "\" a une signification particulière en perl.

    Cela dit, voici une version d'une partie de ton programme corrigée pour tenir compte des bonnes pratiques actuelles (ton style ressemble au Perl des années 1995 à 2000):
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    open my $OUT, ">", "resultat_out.txt" or die "Ouverture impossible de resultat_out.txt $!";
     
    print "Entrez un terme à rechercher" ;
    my $recherche = <STDIN> ;
    chomp $recherche;
     
    opendir my $REP, "C:/Users/User/Dossier/Dossier_test" or die "ouverture impossible du répertoire $!";
     
    # ... recherche du mot
     
    closedir $REP) ;
    close $OUT);
    N'hésite pas si tu as des questions sur ce qui précède.

    Une question pour la partie que j'ai omise ci-dessus: tu recherches le mot dans le nom des fichiers (c'est à peu près ce qu'a l'air de vouloir faire ton code dans la boucle while) ou dans le contenu des fichiers (dans ce cas, il manque pas mal de choses)?

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse =)

    Pour l'ancienneté du code, c'est comme ça que j'ai appris et je soupçonnais déjà que ma prof ne se renouvelle pas beaucoup ^^

    J'ai changé le sens des barres obliques et je n'ai plus le même message d'erreur à la place j'ai "Ouverture du répertoire impossible at recherche.pl line 7, <STDIN> line 1."

    En ce qui concerne la suite je voulais en effet chercher à l'intérieur des fichiers et non pas dans les noms de fichiers mais je voulais résoudre mon premier problème avant de continuer.

    Merci.

  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
    Le chemin du répertoire n'est sans doute pas correct, vérifie-le soigneusement.

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Oui j'ai résolu ce problème, merci !


    Par contre maintenant je veux ouvrir les fichiers du dossier et les lires pour relerver les phrases contenant le mot recherché par l'utilisateur.

    J'ai tenté ce code mais ça ne marche pas, le fichier de sortie se créé mais il est vide.

    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
    #! /usr/bin/perl -w
     
    open (OUT, ">resultat_out.txt") ;
     
    print "Entrez un terme à rechercher" ;
    $recherche = <STDIN> ;
    opendir(REP, "C:/Users/Dossier/Dossier_test") || die "Ouverture du répertoire impossible";
     
     
     
    while ($fichier = readdir(REP)) {
     
    if ($fichier=~/.*\.docx/) {
     open ($fichier) ;
     
    }}
     
    while ( $ligne = <FIC> ){
        chomp $ligne;
    	}
    print OUT ($ligne=~/[A-Z]<STDIN>\./) ;	
     
    close FIC ;
    closedir(REP) ;
    close(OUT);
    Une idée de ce que j'ai mal fait ?

    Merci.

  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
    Bonjour Maarian,

    je vois trois problèmes très différents avec ton code.

    D'abord un bête problème de syntaxe (facile à régler) avec la fonction open. Pour ouvrir un fichier et le lire, la syntaxe minimale est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $nom_fic = "fichier.txt";
    open FIC, $nom_fic;
    while ($ligne = <FIC>) {
        # faire quelque chose avec $ligne
    }
    La fonction open nécessite au moins deux arguments: le file handle (ici "FIC") que tu va utiliser ensuite pour lire le fichier et le nom du fichier à ouvrir (ici contenu dans la variable $nom_fic). Dans ton code, tu utilises <FIC> pour lire le fichier, mais Perl ne peut pas savoir ce que tu veux lire avec FIC, puisque tu ne lui as pas dit.

    Cette syntaxe devrait fonctionner mais n'est franchement pas très bonne (elle date d'il y a 20 ans). Voici pour mémoire une meilleure façon de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my $nom_fic = "fichier.txt";
    open my $FIC, "<", $nom_fic or die "Ouverture impossible de $nom_fic $!";
    while (my $ligne = <$FIC>) {
        # faire quelque chose avec $ligne
    }
    # ...
    close $FIC;

    Ensuite, tu as un sérieux problème de logique dans tes deux boucles.

    Tu le verras beaucoup mieux si tu prends tout de suite l'habitude d'indenter ton code très soigneusement (le compilateur s'en fiche, mais le développeur qui écrit ou lit le code pas du tout, à plus forte raison si c'est un développeur débutant; c'est vraiment indispensable: un programmeur professionnel n'écrirait jamais du code non indenté de cette façon).

    Voici ton code réécrit avec une indentation cohérente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while ($fichier = readdir(REP)) {
        if ($fichier=~/.*\.docx/) {
            open ($fichier) ;
        }
    }
    Ici, en gros, tu parcours le répertoire fichier par fichier, tu ouvres chaque fichier (il faudrait le file handle, mais je passe, on en a déjà parlé), et tu passes au fichier suivant (donc tu ne fais rien avec le fichier que tu viens d'ouvrir), au mieux tu ne liras que le dernier fichier de la liste à la fin.

    Il faut lire le fichier quand tu l'as ouvert immédiatement après l'ouverture, avant de passer au suivant. Donc faire deux boucles imbriquées (et non successives):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (my $fichier = readdir(REP)) {
        if ($fichier=~/\.docx/) {    # .* non utile ici
            open my $FIC, "<" $fichier or die "Ouverture impossible de $fichier $!" ;
            while (my $ligne = <$FIC>) {
                # faire quelque chose avec la ligne
            }
        }
    }
    Le dernier problème est en un sens plus épineux: tu ne peux pas ouvrir et lire un fichier MS Word (extension .docx) de cette façon, car ces fichiers ne sont pas des fichiers texte et ont un format particulier. Pour l'instant, je te conseille de tester avec des fichiers texte (préparés avec un éditeur de texte comme celui que tu utilises sans doute pour écrire ton programme, mais pas avec un traitement de texte de type Word). Si c'est vraiment dans des fichiers Word que tu dois faire ta recherche, il faudra installer et utiliser un module spécialisé, on verra ultérieurement pour ce problème.

    Corrige déjà la syntaxe et la logique du programme et teste avec des fichiers texte. On verra plus tard pour les fichiers Word si c'est vraiment nécessaire pour ton application.

    Bon courage et bon samedi,
    Laurent.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup, j'ai réussi à faire ce que je voulais =)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/03/2014, 23h49
  2. Extraire le code sql pour documentation
    Par guidav dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/06/2006, 12h11
  3. [Système] Remplacement texte dans document actif
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 08/01/2006, 11h43
  4. extraire une partie d'un document rtf
    Par yac dans le forum Oracle
    Réponses: 12
    Dernier message: 08/01/2006, 10h44
  5. Extraire image et texte d'un powerpoint
    Par VLDG dans le forum Langage
    Réponses: 2
    Dernier message: 07/11/2005, 21h48

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