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

Entrée/Sortie Java Discussion :

Comparer une string et un fichier .txt


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Comparer une string et un fichier .txt
    Bonjour,

    Je travaille sur une méthode qui permet d'enlever d'une String les mots présent dans un fichier .txt (mots tous à la ligne dans ce fichier). En fait je cherche à coder une méthode de stop words removal pour ceux qui en aurait entendu parler.

    Voilà ma méthode :
    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
     
    //enlève les stopWords de la string
    public static String removeStopWords(String s) throws IOException{
    			ArrayList<String> wordArrayList = textToWords(s);
    			BufferedReader reader;
    			String Line;
    			String newString = "";
     
    			try {
    				reader = new BufferedReader(new FileReader("StopWords.txt"));
    			while(reader.readLine() != null){
    				Iterator<String> iterator = wordArrayList.iterator();
    			while(iterator.hasNext() ){
    				try {
    					while((Line = reader.readLine())!=null){
    						String n = iterator.next();
    						if(n.equals(reader))
    							iterator.remove();
    					}
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			//convert ArrayList to string
    			for(String str : wordArrayList){
    				newString += str + "\t";
    			}		}
    		} catch (FileNotFoundException e1) {
     
    			e1.printStackTrace();
    		}
     
    			return newString;
    		}
    Sachant que j'ai créé une petit méthode (textToWord) en-dessous qui permet de convertir une String en arraylist:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //créer une Arraylist de mot à partir d'une string
    		public static ArrayList<String> textToWords(String s){
    			String[] tab = s.split(" ");
    		    ArrayList<String> WordArrayList = new ArrayList<String>(Arrays.asList(tab));  
    			return WordArrayList;		
    			}
    Maintenant, je test mon code en appelant la méthode dans un main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) throws IOException {
     
    		System.out.println(removeStopWords("Un 1er-Mai syndical en demi-teinte qui montre la difficulté persistante des syndicats à mobiliser. A Paris, la CGT avance le chiffre de 65 000 (15 500 selon la police), ce qui montre que le renfort de FO n'a pas impulsé de vraie dynamique."));
     
    	}



    Et je pensais avoir géré toute les exceptions mais j'ai toujours un "Nosuchelementexception"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" java.util.NoSuchElementException
    	at java.util.AbstractList$Itr.next(Unknown Source)
    	at test.removeStopWords(test.java:33)
    	at test.main(test.java:14)
    Bref je ne sais pas d'où vient cette erreur, et je ne sais même pas si ce que j'ai fait fonctionne.
    Si quelqu'un pourrait jeter un coup d'oeil, ça serait sympa
    Bonne soirée !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		while(reader.readLine() != null){ // une boucle de lecture sur le fichier (1)
    			Iterator<String> iterator = wordArrayList.iterator();
    			while(iterator.hasNext() ){  // on test qu'on a un iterateur suivant (2)
    				try {
    					while((Line = reader.readLine())!=null){ // (1) qui n'ira pas loin puisque cette boucle imbriquée bouffe tout le fichier
    						String n = iterator.next(); // (2) mais on appelle next() dans la boucle imbriquée, donc N fois par test et non pas 1 fois
    						if(n.equals(reader))
    							iterator.remove(); 
    					}
    Bref, t'as une boucle en trop dans ton code, revois ta logique. Par ce que pour le moment, c'est pour chaque ligne du fichier, pour chaque mot de la liste, pour chaque ligne du fichier

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Ok merci, le 3e while n'avait rien à faire ici


    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
    public static String removeStopWords(String s) throws IOException{
    		ArrayList<String> wordArrayList = textToWords(s);
    		BufferedReader reader;
     
    		String newString = "";
     
     
    			reader = new BufferedReader(new FileReader("StopWords.txt"));
    		while(reader.readLine() != null){
    			Iterator<String> iterator = wordArrayList.iterator();
    		while(iterator.hasNext() ){
    					String n = iterator.next();
    					if(n.equals(reader))
    						iterator.remove();
    				}
     
     
    		//convert ArrayList to string
    		for(String str : wordArrayList){
    			newString += str + "\t";
    		}
    		}
     
    			return newString;	
    		}
    Voilà ce que ça donne maintenant
    J'ai viré les try/catch (Eclipse ne les demandais pas)
    Au final j'obtient qqchose dans la console en compilant, mais ce n'est pas le résultat que j'attends : je retrouve ma String passé en paramètre avec plus d'espace entre chaque mots.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu as mis des tabulations, pas des espaces entre les mots.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Ah ok, le \ t c'est pour les tabulations ! Ouais je l'ai viré, ça ne me servais pas à grand chose.

    En revanche, le iterator.remove() n'est pas censé supprimé le mot en question ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si, en cas d'égalité. Mais là tu compare d'un coté un String et de l'autre coté un Reader: ça ne pourra jamais être égal. Ce que tu veux comparer, c'est ce qui sort de readLine, mais tu ne le stocke null part donc difficle

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/08/2014, 16h37
  2. Table d'une Bde Access vers fichier .txt
    Par cefabien dans le forum Access
    Réponses: 2
    Dernier message: 08/12/2005, 11h31
  3. Comment comparer une string et un float ?
    Par chourmo dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 12h51
  4. Ecrire le résultat d'une query dans un fichier txt
    Par jbaers dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/11/2005, 01h49
  5. Comment enregistrer une string dans un fichier
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/09/2005, 14h52

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