Texte sans les mots vides

Signaler
Messages postés
5
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
9 novembre 2011
-
 souma2222 -
Bonjour,

j'ai 2 fichiers : un contenant un texte et l'autre contenant un liste de mots vides. Mon but est de renvoyer le texte sans les mots vides. Mon problème est que ça ne m’enlève qu'un seul mot vide, le premier qu'il trouve...


//on va mettre la liste des mots vides dans une hashtable
InputStream ips2=new FileInputStream(liste_mots_vides);
InputStreamReader ipsr2=new InputStreamReader(ips2);
BufferedReader br2=new BufferedReader(ipsr2);

//tant qu'il y a des lignes
while ((line2=br2.readLine())!=null)
{
//On retire tous les symboles de liaison
st2 = new StringTokenizer(line2, ",.:;!?_\n\t"'{}()=<>");

//tant qu'il y a des mots
while(st2.hasMoreTokens())
{
//on recupere le mot
mot2 = st2.nextToken();
mot2=mot2.toLowerCase();
//on ajoute le mot vide dans la table
table.put(mot2,1);

}
}

//lecture du fichier texte
InputStream ips=new FileInputStream(fileName);
InputStreamReader ipsr=new InputStreamReader(ips);
BufferedReader br=new BufferedReader(ipsr);

//tant qu'il y a des lignes
while ((line=br.readLine())!=null){

//On retire tous les symboles de liaison
st = new StringTokenizer(line, ",.:;!?_\n\t"'{}()=<>");

//tant qu'il y a des mots
while(st.hasMoreTokens())
{
//on recupere le mot
mot = st.nextToken();
mot=mot.toLowerCase();

//on regarde si le mot est dans la table
Integer test = (Integer)table.get(mot);
//s'il ne l'est pas on le rajoute au texte
if (test == null) text += mot + "";
}
}
br.close();
return this.tokenize(text.toLowerCase());


Merci d'avance pour votre aide

6 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Bonjour,

Tu t'embêtes en exécutant ce code, java te permet d'utiliser des expressions régulières : essayes ce code et tu verras comme les expressions régulières sont puissantes :

String motsVides = "\\p{Space}mot1\\p{Space}|\\p{Space}mot2\\p{Space}|\\p{Space}vide1\\p{Space}";
String ligne = "le mot suivant : ( mot1 ) sera effacé ainsi que ( vide1 ) mais pas ( mot12 )";
System.out.println(ligne.replaceAll(motsVides, " "));


Le résultat affiché est : "le mot suivant : ( ) sera effacé ainsi que ( ) mais pas ( mot12 )"
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Pour t'expliquer un peu l'expression régulière utilisée :
\\p{Space} signifie un caractère d'espacement (une tab, un espace ou un retour à la ligne)
| signifie OU

Donc l'expression régulière utilisée signifie un caractère d'espacement suivi de mot1 suivi d'un caractère d'espacement ou un caractère d'espacement suivi de ...

Et replaceAll te permet de remplacer toutes les occurrences de cette expression régulière dans la ligne par " ".
Messages postés
5
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
9 novembre 2011

Merci pour la réponse mais dans mon exercice je dois utiliser obligatoirement les 2 fichiers...
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Oui, ca n'empêche pas que tu utilises les deux fichiers :

Je te donne un truc qui peut t'aider à le faire plus proprement, isole les actions à effectuer. Tu peux créer une classe qui ne fait que de lire le contenu d'un fichier texte et qui retourne son contenu sous la forme d'une liste de String qui correspond à la liste des lignes.

Au début de ton programme, tu appelles cette fonction :
ArrayList<String> lignesMotsVides = lireFicheir(cheminFichierMotsVides);

et ensuite, avec la liste des mots vides, tu créé l'expression régulière :
String regex = "";
for(String s : lignesMotsVides){
   String[] motsDeLaLigne = s.split("\\p{Space}");
   for(String mv:motsDeLaLigne){
      regex=regex+"\\p{Space}"+mv+"\\p{Space}|";
   }
}


Puis, tu lis le fichier ou se trouvent les mots à remplacer et tu remplaces :
ArrayList<String> lignes = lireFichier(cheminFichier);
for(String s : lignes){
   s=s.replaceAll(regex, " ");
}


Il ne te reste plus qu'à réécrire le fichier
Messages postés
5
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
9 novembre 2011

Merci beaucoup (un peu tardivement désolé). Finalement j'ai utilisé un removeAll.
Bonjour,
j'ai 21 fichiers : 20fichiers contenant des textes et 1seul fichier contenant une liste de mots vides. Mon but est de remplacer chaque mot vide existant dans les fichiers par un espace..
voila mon code :
j'espère que me vous aidez

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ReadStpList
{
public void Lecture(String[] args){
String chaine="";
String stplist1;

//lecture du fichier stoplist
try{

InputStream fichier=new FileInputStream("D:/projet/ProjetRecherche/stoplist.txt"); //ouvrir le fichier
InputStreamReader fich=new InputStreamReader(fichier);
BufferedReader br=new BufferedReader(fich);//lire le fichier
String ligne;
String stplist="";
while ((ligne=br.readLine())!=null)
{
stplist1=ligne.replaceAll(stplist, " ");
System.out.println(ligne);
chaine+=ligne+"\n";
}
br.close();
}
catch (Exception e){
System.out.println(e.toString());
}
}

public static void main(String[] args){
ReadFile lecture=new ReadFile();
lecture.Lecture(args);//instance de class readFile qui permet de lire les 20 fichiers

ReadStpList lire=new ReadStpList();
lire.Lecture(args); //instance de class pour la lecture fu fichier stoplist

}
}