gogrin
Messages postés5Date d'inscriptiondimanche 11 mars 2007StatutMembreDerniè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);
//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());
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020370 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 )"
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020370 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 " ".
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020370 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 :
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
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