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 Java Discussion :

Trouver un mot dans un fichier texte


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut Trouver un mot dans un fichier texte
    Salut les gens,

    Bon voila, tout est dans le titre. Ca semble super simple, pourtant j'ai cherché pendant des heures sur internet pour trouver une methode simple et efficace, pas moyen!

    Le problème est simple : j'ai un TP a faire ou on me demande d'ecrire un programme en java qui accede a un dossier puis lit les fichiers txt qui s'y trouvent un par un pour y chercher une chaîne de caractère entrée par l'utilisateurs.

    Le truc c'est que à mon uni ils sont pas tres fortiche pour apprendre le java clairement, du coup on est un peu dans une optique du "débrouille toi". Au semestre dernier on a vu les flux de fichiers tout ca, donc acceder a un fichier, le lire, en créer un tout ca je sais a peu pres faire (si j'ai pas deja oublié ).

    Mais la j'avoue je bloque...j'ai vu par ci par la qu'on pouvait utiliser les tokenizer (qu'on a a peine survolé donc super) ou le indexOf. IndexOf me paraît etre la façon la plus simple d'arriver a mes fins mais l'exemple qu'on nous a donné de l'utilisation de indexOf c'est tout simplement le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String s = "bonjour" //on crée un String
    ...
    System.out.println("Il y a "+s.indexOf('j'))+" occurances de j dans bonjour"); // ici ca nous renvoit donc "il y a 1 occurance de j dans bonjour".
    Mais voila...moi c'est a partir d'un fichier que je dois faire ca et j'avoue que je sais pas trop comment m'y prendre . Mettre tout ce qui se trouve dans le fichier dans un tableau de string?

    Si quelqu'un aurai une idée et un bout de code pour que ce soit plus clair que me renvoyer juste des methodes a utiliser (ouai je suis exigent ), ca cherai gentil

    Bonne soirée et bon w-e

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut

    Tu dois rechercher un mot ou une occurrence ? Je veux dire, si l'utilisateur tape "jour", est-ce que le programme est supposé indiquer que le "mot" a été trouvé dans "bonjour" ?
    Supposons que oui, alors la méthode java.lang.String.indexOf() peut être une solution parmi d'autres.
    Tu lis le fichier ligne par ligne avec la méthode readLine() de ton flux de lecture et tu regardes si le mot s'y trouve, sachant que readLine() te renvoie un String contenant la ligne entière. A partir de là, c'est facile je pense.
    N'hésite pas à demander plus de détails si tu bloques

    Nas'

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Salut nasky,

    Deja merci pour ton aide

    Alors, selon le TP "ecrivez un programme qui accede à ce repertoire (note : un fichier zip qui une fois dézippé contient 5 fichiers txt) et lit ses fichiers un par un pour y chercher une expression réguliere (chaine de caracteres donnée (passée en parametre de la méthode main). Le programme affichera comme réponses les noms des fichiers contenant l'expression etc..."

    Donc moi je le comprends comme ca : si on entre "jour", le programme devra trouver "jour" et non pas "bonjour" par exemple.

    Enfin bon, je vais essayer ce que tu me proposes demain, se fait un peu tard pour javater

    Merci!

    +++

  4. #4
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Ah, "expression régulière" ça pourrait être une vraie expression régulière et non "mot". Dans ce cas, il faudrait passer par les classes Scanner et Pattern je pense.
    Sinon, si c'est effectivement un mot qu'il faut chercher alors soit tu fais comme j'ai dit si c'est une occurrence. Soit tu décomposes chaque ligne en mot et tu compares au mot recherché.
    Pour décomposer selon le séparateur espace, tu passes effectivement par StringTokenizer par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String ligne ;
    StringTokenizer st = new StringTokenizer(ligne);
    // tant qu'il y a un mot séparé par l'espace
    while(st.hasNext())
    { 
       st.next() ; // mot séparé par l'espace
    }
    Javate bien demain

    Nas'

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Bon...j'essayes d'implémenter indexOf correctement mais c'est...foireux ?

    J'ai 5 fichiers textes dans le dossier. Selon le TP le prog doit les lire 1 par 1 pour y trouver la chaîne de caractères, mais comme je suis pas super doué, pour l'instant je ne m'occupe que d'un fichier!

    Bref voila le code que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    File fichier = new File ("./textes/texte1.txt");
    	  FileReader fr = new FileReader(fichier);
    	   BufferedReader br = new BufferedReader(fr);
    			String s1 = br1.readLine();
    				/*while(br1.ready()) {  // si j'ai envie d'afficher le texte dans la console...
    					System.out.println(br1.readLine());
    				}*/
    					System.out.println("votre recherche : "+s+" apparait "+s1.indexOf(s)+" fois.");
    PS : le string "s" est ce que l'utilisateur à entré au clavier, le code pour ca est juste au dessus de try mais je ne l'ai pas mis.

    Alors voila, j'ai réussit a créer le plus mauvais moteur de recherche dans l'histoire de l'informatique ^^. Disons que pour le tester, j'ouvre le fichier texte1 pi je regarde ce qu'y a comme mot : si je lui donne "nordique" pour lui il apparaît "-1 fois" (Alors qu'il est dans le texte). Par contre "en" apparaît 33 fois
    Je suis sur que tu vas me dire que le probleme, c'est qu'il ne lit pas ligne par ligne je me trompe? Suis pas trop sur de ce que je dois ajouter pour qu'il le fasse...j'ai bien conscience que mes questions sont plutot assez n00besques mais bon

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    readLine te renvoi une ligne, donc oui tu lis bien ligne par ligne.
    Le indexOf ne renvoi pas l'index du mot ( sous entendu qu'un mot est entouré d'espace(s) ) mais l'indexe de la chaine ( qu'il y ait ou non des espaces avant et/ou après ). StringTokenizer permet de décomposer la ligne en mots ( qui eux sont séparés par des espaces ).
    pour le -1 que tu récupère, c'est que cette chaine n'est pas présente dans la chaine, si elle l'était tu aurais un indice supérieur ou égale à 0 donnant l'endroit où la première occurence se trouve dans la ligne.

    Sinon pour compter le nombre de fois où un mot est dans un fichier, il faut utiliser un compteur que tu incrémenteras à chaque fois qu'il à été trouvé dans la ligne lue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int compt=0;
    String line=null;
    while((line=br.readLine())!=null){
       StringTokenizer st=new StringTokenizer(line);
       while(st.hasMoreTokens()){
          if(st.nextToken().equals("leMotRecherché")){
             compt++;
          }
       }
    }
    System.out.println("Le mot a été trouvé "+compt+" fois.");

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Salut iohack!

    Super merci pour ton aide, ca marche!

    Maintenant j'aurai une autre question. Dans le TP on me demande de lire les fichiers du repertoire les uns apres les autres (y'a 5 fichiers txt dans lesquels la recherche doit se faire). Or je ne sais pas trop comment m'y prendre. Comme ca ca irait? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    FileReader fr1 = new FileReader ("./textes/texte1.txt");
    FileReader fr2 = new FileReader ("./textes/texte2.txt");
    ...
    BufferedReader br1 = new BufferedReader (fr1);
    BufferedReader br2 = new BufferedReader (fr2);
    ...
    C'est a dire créer un filereader avec son buffer pour chaque fichier puis...implémenter une autre boucle pour la recherche ou il passe au fichier suivant une fois qu'il a parcourut le premier etc...? Ca me parait bien compliqué, y'aurai pas une façon toute simple d'indiquer au programme de faire la recherche directement dans chaque fichier?

    Merci pour votre aide!!

    @+

  8. #8
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Yo

    Si tu connais le nombre de fichiers et leur nom alors pas besoin de parcourir le dossier pour prendre les fichiers, c'est bien ça ?

    Dans ce cas, soit tu traites chaque fichier l'un après l'autre soit tous en même temps, chacun dans un thread.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // tu crees une classe qui analyse pour chaque fichier : exemple FileAnalyzer
    //Et tu auras donc dans ta classe principale un truc dans le genre
    for(int i=0 ; i<5 ; i++)
      new Thread(new FileAnalyzer(nomFichierN)).start(); 
    // et tu crees dans le constructeur un flux de fichier pour chaque fichier, etc.
    Ca va lancer un thread pour chaque fichier et comme ça, chaque analyse ne gênera pas l'autre.

    De la doc sur les threads : http://alwin.developpez.com/tutorial/JavaThread/

    Nas'

  9. #9
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Regarde la javadoc de la classe File. La méthode listFiles appliquée sur un Objet File pointant sur un répertoire te fournit un tableau de File pointant sur les fichiers ( et répertoires ) contenus dans ce répertoire.
    Après avoir récupérer ça, il ne te reste plus qu'à boucler sur le tableau obtenu pour ouvrir, et analyser chaque fichier.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Ok j'irai peut etre voir ca . J'm'en suis tenu a une repetition de 5 fois le try catch. Truc c'est que ca marchera pas si on ajoute un 6eme fichier. Mais bon, c'est pas exactement ce qu'on nous demande.

    J'aimerai aussi que le programme affiche la ligne a laquelle il trouve le mot dans chaque fichier. Pour ca j'utilise getLineNumber :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    LineNumberReader lnr = new LineNumberReader(br1) //br1 etant le bufferedReader
    ...
    if (st.nextToken().equals(r1)) { //r1 etant le mot recherché
    compt++;
    System.out.println("le mot a ete trouvé a la ligne : "+lnr.getLineNumber());
    Ca marche dans le sens ou il m'affichera bien 5 fois la phrase "le mot a été trouvé..." si le mot se trouve p.ex. 5 fois dans le texte, mais le getLineNumer me renvoi 0, ce qui donne :

    le mot a ete trouvé a la ligne : 0

    Et ce 5 fois d'affilé. J'ai regardé dans la doc java mais je ne vois pas pourquoi ca ne marche pas...

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je ne connaissais pas cette classe. Mais d'après la Javadoc, il faut utiliser l'objet pour lire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LineNumberReader lnr = new LineNumberReader(br1) //br1 etant le bufferedReader
    // et pour lire on fait : 
    lnr.readLine();
    Peut-être lis-tu directement avec br1 et non lnr d'où le compteur qui ne bouge pas.

    Nas'

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Ouai en fait j'ai essayé tout a l'heure avec le readLine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    lnr.readLine();
    system.out.println("mot trouve a la ligne : "+lnr.getLineNumber());
    mais la ca semblait derranger la recherche : par exemple si je cherche le mot "dans" dans le texte 1 (qui apparait 5 ou 8 fois je crois), il me sort :

    le mot a ete trouvé a la ligne : 1
    le mot 'dans' a été trouvé 1 fois dans le fichier texte1.

    Alors que dans y est au moins 5 ou 6 fois. Sans le readLine ca fonctionne correctement, cay bizarre! Je vais essayer avec br1 a la place de lnr

    EDIT

    En effet tu avais raison Nas, fallait changer un br1 en lnr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while ((line=lnr.readLine())!=null) {  //ICI j'avais br1.readLine().
     
    				StringTokenizer st=new StringTokenizer(line);
    					while (st.hasMoreTokens()) {
     
    						if (st.nextToken().equals(r1)) {
    							compt++;
    							System.out.println("le mot a ete trouve a la ligne : "+lnr.getLineNumber());
    						}
    					}
     
    			}
    Bon ben je crois qu'il est terminé ce TP! Merci à iohack et toi Nas, m'avez vraiment bien aidé!

    Bonne soirée!

  13. #13
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Sinon il y a la classe Scanner qui est faite exactement pour ce que tu veux faire
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

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

Discussions similaires

  1. trouver un mot dans un fichier
    Par samaa dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2007, 16h21
  2. Ecrire un mot dans un fichier texte existant
    Par Mickey.jet dans le forum Delphi
    Réponses: 10
    Dernier message: 26/02/2007, 23h23
  3. Réponses: 10
    Dernier message: 29/04/2006, 10h40
  4. Trouver un mot dans un fichier texte
    Par godik dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 10/03/2006, 14h31
  5. Réponses: 4
    Dernier message: 16/12/2005, 17h43

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