Java : Lire un fichier

Résolu/Fermé
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 - 25 nov. 2011 à 14:49
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 - 28 nov. 2011 à 00:13
Bonjour,

je souhaite créer un programme en Java qui me permettrai de charger une liste de verbes irréguliers en anglais, d'afficher les infinitifs dans une liste de sélection (ComboBox), et d'afficher dans 3 cases le prétérit, le participe passé et enfin la traduction.

Le fichier texte que je dois charger se décompose de la manière suivante :

"
to beat beat beaten battre
to be was/were been être
...
"

Je dispose donc de cette interface :

http://servimg.com/index.php?noimg=1&lang=en&k=136

Nous voyons ma ComboBox (verbe), et les 3 cases qui nous serviront à afficher les 3 infos différentes.

J'aimerai commencer par suciter votre aide au niveau de l'affichage des infinitifs dans la liste, j'ai le code suivant au départ :

http://servimg.com/index.php?noimg=1&lang=en&k=136

D'origine je dispose des informations jusqu'au "BufferedReader..."

J'ai ajouté moi-même la bocule while, mais j'aimerai stocker chaque ligne récupèré dans un vecteur "v", je ne sais pas trop comment m'y prendre.

Ensuite, je souihaite découper les lignes récupèrer morceau par morceau, d'où mon utilisation d'un StringTokenizer, mais je n'y arrive pas correctement, pourtant je sent que je ne suis pas loin.

Autre problème, je ne souhaite récpèrer QUE les infinitifs, soi le premier mot de chaque ligne et le placer dans la comboBox ...

Je pense que le reste doit être bon :

http://servimg.com/index.php?noimg=1&lang=en&k=136

A vérifier, car il faut que la 1ere partie fonctionne bien pour que celle-ci entre en action !

Bref, je sollicite votre aide dans l'espoir d'avoir une réponse qui pourra m'aider

Merci d'avance
A voir également:

7 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 nov. 2011 à 17:16
Regarde les possibilités qu'offrent la classe Scanner en particulier avec des méthodes de traitement d'expressions régulières comme match ou findWithinHorizon.
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
27 nov. 2011 à 12:56
Merci de votre réponse
Je pense avoir une idée mais mon problème réside dans le fait que je n'arrive pas à charger mon texte dans mon vecteur V,
si vous pouviez m'indiquer comment réussir à le charger, je dispose de ceci :

while((ligne = br.readLine())!=null)
{
contenu = v.add(ligne);
}

Mais je veux décomposer mon texte (lu ligne par ligne) avec un StringTokenizer, et c'est là qu'intervient mon problème.

N'arrivant pas à charger mon texte correctement dans le vecteur, je n'arrive pas à le décomposer correctement

Merci d'avance de votre réponse
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 nov. 2011 à 18:49
Comme je l'ai dit, je pense que tu as tout intérêt à utiliser Scanner (JDK 1.5). qui combine le comportement de BufferedReader (JDK 1.1) et StringTokenizer (JDK 1.0) en une seule classe, ça t'évite d'avoir à tout gérer en même temps, et c'est plus efficace.

Scanner fichier = new Scanner(new File("english.txt"),"iso-8859-1");

while(fichier.hasNextLine())
    System.out.println("["+fichier.nextLine()+"]");

fichier.close();

Pour ta décomposition de la ligne, il serait plus simple que tu es des \t entre chaque champ, dans ce cas tu peux recréer un autre Scanner sur la ligne lue pour distinguer chaque champ.

Scanner fichier = new Scanner(new File("english.txt"),"iso-8859-1");
	
while (fichier.hasNextLine())
{
	Scanner ligne = new Scanner(fichier.nextLine()).useDelimiter("\t");
	while (ligne.hasNext())
		System.out.print("["+ligne.next()+"]");
	System.out.println();
}
	
fichier.close();

Remarque : tu parles d'un vecteur v, si tu parles de la classe Vector, il y a mieux à utiliser, au minimum une Arraylist, voire des HashMap selon ce que tu veux faire...
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
27 nov. 2011 à 22:23
Disons que je ne connais pas trop ces outils, j'ai débuté la programmation JAVA il y a seulement quelques mois, et j'ai pour consigne de respecter ce genre d'écriture, c'est à dire utiliser seulement les lectures bufferisées ligne par ligne et les String Tokenizer.

Ce qui me dérange c'est que je n'arrive pas à faire mon StringTokenizer comme je le souhaite, si j'écrit

while((ligne = br.readLine())!=null)
{
contenu = v.add(ligne);
}

StringTokenizer st = new StringTokenizer(contenu, "\n\t", false)

ça plante, vu que contenu est soi-disant du type boolean, alors là je sèche complétement, je ne comprend pas trop mon erreur
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 nov. 2011 à 23:04
Qu'est ce que c'est v ? Si c'est bien un Vector comme je le pense, alors c'est normal que add renvoie un booléen qui vaut true si le contenu a changé ou false sinon.
Si ce que tu veux c'est récupérer la valeur de la ligne et bien utilise directement ta variable ligne...
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
27 nov. 2011 à 23:08
Oui v est un vector excusez-moi de ne pas avoir précisé !

j'ai tenté de faire :

while(st.hasMoreTokens())
{
for(int i=0; i<ligne.length(); i++)
{
verbe.addItem(st.nextToken());
st.nextToken();
st.nextToken();
st.nextToken();
}
}

Je récupère le premier mot à chaque fois, donc, l'infinitif. Mais ça ne marche pas, je ne comprend pas
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 27/11/2011 à 23:23
Je n'ai pas trop compris ce que tu voulais faire exactement, mais voici un petit exemple d'utilisation.

public static void main(String...args) throws IOException
{
	BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
	String ligne;
	while ((ligne = br.readLine())!=null)
	{
		System.out.println(ligne);
		StringTokenizer st = new StringTokenizer(ligne,"\n\t",false);
		while (st.hasMoreElements())
			System.out.println(st.nextToken());
	}
}

Remarque : ça ne fonctionnera que si tu as bien des \t entre chaque champ, si ce n'est pas le cas le résultat sera moins intéressant...
0

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

Posez votre question
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
27 nov. 2011 à 23:25
En fait, je dispose d'un fichier "irregulier.txt" que je souhaite 'ajouter' dans le vector v.

irregulier.txt est du genre :

"be was/were been être
to steal stole stolen voler"

La liste étant trés longue, je fais une boucle FOR

et je souhaite donc prendre tous les premiers terme de cette liste, soit l'infinitif du verbe en anglais, et l'ajouter dans ma liste nommée "verbe"

d'où le verbe.addItem() en première action dans la boucle, mais je n'arrive pas à ajouter quoi que ce soit dans ma liste :/
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 27/11/2011 à 23:36
Remarque : il est impossible de savoir quand il faut couper au premier espace (entre be et was) et quand il faut couper au deuxième espace (entre steal et stole), il faut qu'il y ait un séparateur autre que l'espace (par exemple \t) pour savoir où couper.

Si je reprends mon exemple ça donne avec Tokenizer :

public static void main(String...args) throws IOException
{
	BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));	
	String ligne;
	JComboBox verbe = new JComboBox();
	
	while ((ligne = br.readLine())!=null)
	{
		StringTokenizer st = new StringTokenizer(ligne,"\n\t",false);
		if (st.hasMoreElements())
			verbe.addItem(st.nextToken());
	}
	
	for (int i =0; i<verbe.getItemCount(); i++)
		System.out.println(verbe.getItemAt(i));
}


Ou plus simple, sans Tokenizer :

public static void main(String...args) throws IOException
{
	BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));	
	String ligne;
	JComboBox verbe = new JComboBox();
	
	while ((ligne = br.readLine())!=null)
		verbe.addItem(ligne.substring(0, ligne.indexOf("\t")));
	
	for (int i =0; i<verbe.getItemCount(); i++)
		System.out.println(verbe.getItemAt(i));
}
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
27 nov. 2011 à 23:45
while ((ligne = br.readLine())!=null)
{
StringTokenizer st = new StringTokenizer(ligne,"\n\t",false);
if (st.hasMoreElements())
verbe.addItem(st.nextToken());
}

en tapant cela, je vais prendre le premier terme de chaque ligne ? Ou bien ça va prendre tous les termes et les mettre dans ma liste ?

Car je ne souhaite prendre que le premier terme de chaque liste "be", "to steal", "to broke", "have", etc ...

Autre question, je n'ai pas vu l'outil "getItemCount()", y'aurait-il un autre outil similaire ?
De même pour l'outil "getItemAt()"
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 nov. 2011 à 23:56
Il faut que tu testes tout ça pour voir ce que ça fait !!!
Effectivement, ça ne prendra que le premier terme (les deux codes font la même chose)
Après moi j'utilise getItemAt pour lire ce qui est dans la JComboBox car j'ai pas envie de créer toute une interface Swing pour faire les tests mais vu que toi tu l'as déjà ça devrait s'afficher directement.
Remarque : si tu attends qu'on t'apprenne tout du langage Java, dans un an tu n'en seras qu'au niveau débutant, on ne peut pas tout t'apprendre et il faut faire preuve d'un peu d'autonomie.
Personnellement j'utilise toujours Scanner et du coup je ne me sers jamais de BufferedReader, StringTokenizer et autres (faut dire qu'ils sont très compliqués pour pas grand chose), mais il me suffit de regarder dans la documentation, et hop je sais comment ça marche...
Si tu sais te servir de la documentation la plupart de tes questions vont s'envoler en quelques clics !
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
28 nov. 2011 à 00:08
J'essaie toujours de faire ou refaire les programmes chez moi en autonomie mais les résultats ne sont pas encore là :/ Le problème c'est qu'on me demande d'utiliser BufferedReader, StringTokenizer, etc ... Si j'utilise d'autres méthodes, ne serai-je pas embêté quand il s'agira justement de manipuler ces outils plus complexes qu'on me demande ?

Je consulte la documentation et en effet, il y a énormément de choses possibles, y'en a du pain sur la planche ^^
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
28 nov. 2011 à 00:12
Ces outils sont complexes car ils sont plus vieux, Scanner fait la même chose car il combine les deux (et un peu plus) mais en plus simple. Là ta question portait sur getItemCount, et getItemAt, ce ne sont que des méthodes pour ta JComboBox verbe...
0
Julo_du_59 Messages postés 80 Date d'inscription dimanche 3 août 2008 Statut Membre Dernière intervention 9 mars 2013 2
28 nov. 2011 à 00:13
Je pense qu'avec ces outils je m'en sortirai mieux, merci de tes réponses KX !
0