Texte sans les mots vides

gogrin Messages postés 5 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 9 novembre 2011 - 5 oct. 2011 à 16:04
 souma2222 - 23 déc. 2012 à 22:42
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

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 oct. 2011 à 16:24
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 )"
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 oct. 2011 à 16:27
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 " ".
0
gogrin Messages postés 5 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 9 novembre 2011
5 oct. 2011 à 22:58
Merci pour la réponse mais dans mon exercice je dois utiliser obligatoirement les 2 fichiers...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 oct. 2011 à 09:21
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gogrin Messages postés 5 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 9 novembre 2011
9 nov. 2011 à 12:37
Merci beaucoup (un peu tardivement désolé). Finalement j'ai utilisé un removeAll.
0
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

}
}
0
Rejoignez-nous