is_utf8:1,
Rechercher : dans
Par :

Recuperer donnée d'un fichier texte JAVA

Dernière réponse le 5 jui 2009 à 17:12:11 mariam, le 1 jui 2009 à 20:35:32 
 Signaler ce message aux modérateurs

Bonjour tout le monde,
j'etais entrain de voir les reponses deja proposées dans ce site pour lire un fichier texte et afficher son contenu (en JAVA)
Mon but c'est que je veux extraire une valeur bien determinée du fichier texte et la stocker dans une variable.

le code suivant aide à afficher tout le contenu du fichier

public static void main(String[] args) {

String chaine = null;
// lecture du fichier texte
try {
InputStream ips = new FileInputStream("fichier.txt");
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String ligne;

while ((ligne = br.readLine()) != null) {
System.out.println(ligne);
chaine += ligne + "\n";
}
br.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}


mais mon but c'est de recuperer par exemple la 2eme valeur de la 2eme ligne de mon fichier texte
sachant que le fichier texte comporte des int.

Merci pour votre aide...

1

danimo, le 2 jui 2009 à 10:50:57

Bonjour,

Quelle est le format de tes lignes ?
Quand tu dis "sachant que le fichier texte comporte des int.", tu veux dire des entiers ?
Par exemple ligne2 = "100 200 300 .... 245" et c'est 200 que tu veux extraire (selon ton exemple)?

Donc donnes nous le format de tes lignes, mais aussi dis nous comment tu envisages de fournir le critère sélection de la valeur à extraire. C'est peut-être tout simplement la deuxième valeur de la deuxième ligne!

Cordialement,

Dan

Répondre à danimo

2

louna2009, le 2 jui 2009 à 10:58:44

Bonjour,
oui mon fichier texte comporte plusieurs lignes d'entiers
en fait, mes variables du programme que je dois ecrire seront initialisées depuis le fichier texte...
par exemple var1 = donnée (ligne1, 1ere valeur)
var2 = donnée ligne 2 , 1ere valeur...

Merci pour votre réponse

Répondre à louna2009

3

Herezia, le 2 jui 2009 à 12:04:38

Si tu fonctionnes ligne par ligne (.readLine()), et si j'ai bien compris ce que tu veux

List<Integer> valeurs = new ArrayList<Integer>();
while ((ligne = br.readLine()) != null) {
	System.out.println(ligne);
	chaine += ligne + "\n";
	valeurs.add(Integer.parseInt(chaine));
} 

Le principe que pour chaque ligne du fichier tu ajoutes l'entier de la ligne dans la liste d'entiers.

La méthode statique parseInt de la classe Integer permet de transformer une chaîne de caractère en entier. Car évidement, tout ce que retourne readLine est de type String.

Tiens nous au courant de ton avancement

Répondre à Herezia

4

louna2009, le 2 jui 2009 à 12:08:08

Merci pour votre proposition mais je veux pas parcourir tout le fichier texte
je veux acceder directement aux lignes directement et plus precisemment aux données des lignes

ligne 1: represente 2 ou 3 valeurs que je dois stocker dans 2 ou 3 variables (selon le nbre de données dans la ligne)
ligne 2: contient 3 u 4 valeurs >> je stocke l'une des valeurs selon mon choix....
merci encore une fois

Répondre à louna2009

5

Herezia, le 2 jui 2009 à 12:11:45

Je vais manger je te réponds dans 30 minutes

Répondre à Herezia

6

louna2009, le 2 jui 2009 à 12:20:34

Lol!! bon appetit alors ;)

Répondre à louna2009

7

danimo, le 2 jui 2009 à 13:29:23

Re,

Exemple pour extraire la 1ère valeur de chaque ligne:

public static void main(String[] args)
{
//String chaine = null;
// lecture du fichier texte
try {
InputStream ips = new FileInputStream("VarAextraire.txt");
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String ligne;
int numLigne = 0;
int nombreDeLignes = 4; // par exemple
int[] var = new int[nombreDeLignes ];

while ((ligne = br.readLine()) != null)
{
numLigne++;
System.out.println(ligne);
//chaine += ligne + "\n";
int ind = ligne.indexOf(" ");
var[numLigne -1] = Integer.parseInt(ligne.substring(0, ind));
}

for (int i = 0; i < var.length; i++)
{
System.out.println("var[" + i + "] = " + var[i]);
}

br.close();
}
catch (Exception e) {
System.out.println(e.toString());
}

Dan

Répondre à danimo

9

louna2009, le 2 jui 2009 à 18:09:51

Merci "danimo" pour votre proposition
Je lai exécutée et jai ça comme message
java.lang.StringIndexOutOfBoundsException: String index out of range: -1

bon j'avoue que je suis pas du tout forte en java.io c'est pour ça que jai pas compris il est où le probleme!!!

merci encore une fois

Répondre à louna2009

10

danimo, le 2 jui 2009 à 18:19:13

Est-que cette ligne existe bien :


while ((ligne = br.readLine()) != null)
{
numLigne++; // CETTE LIGNE !!!
System.out.println(ligne);

Répondre à danimo

11

louna2009, le 2 jui 2009 à 18:21:36

Oui je lai mise biensur!!

Répondre à louna2009

12

danimo, le 2 jui 2009 à 18:28:38

Effectivement, sinon on aurait un autre message.

Alors c'est sans doute ici:
int ind = ligne.indexOf(" ");

Est-ce que les valeurs dans les lignes sont bien séparées par un espace (celui qu'on recherche avec cette fonction) ?

Répondre à danimo

15

louna2009, le 2 jui 2009 à 19:04:21

Vous avez reçu mon message???

Répondre à louna2009

13

louna2009, le 2 jui 2009 à 18:29:45

Jai su d'ou est ce que ça provient
c'est parce que la 1ere ligne de mon fichier texte etait vide
il fallait juste supprimer l'espace

jai l'affichage des 4 premieres lignes.
je vais essayer de declarer d'autres variables et suivre votre principe!!
Je vous confirme plutard

merci

Répondre à louna2009

14

louna2009, le 2 jui 2009 à 18:36:09

ça affiche toujours la ligne entiere

regarde
le fichier texte par exmple comprte

3 45
3 4 6
2 3 67 89

je dois declarer des variables comme suit:
int a = 1ere valeur de la 1ere ligne
int b = 2eme valeur de la 1 ere ligne
int c = 2eme valeur de la 2eme ligne
...

Répondre à louna2009

16

danimo, le 2 jui 2009 à 19:16:13

L'affichage de la ligne entière est fait pour info.
Ce qui compte c'est ce que l'on a dans le tableau var[] et qui en fait dans mon exemple contient, comme tu le donnais comme exemple, la 1ère valeur de chaque ligne.
Si le ou les critères de l'extraction peuvent changer, il faut envisager de les saisir avant la lecture...

Mais avant, si tu veux bien, on ajoute le code pour initialiser tes variables a, b, c, d pour cet exemple.

En fin de lecture, nous avons:

for (int i = 0; i < var.length; i++)
{
System.out.println("var[" + i + "] = " + var[i]);
}

C'est pour contrôler le contenu de var[].

Ajoutons pour l'instant:

int a = var[0];
int b = var[1];
int c = var[2];
int d = var[3];
System.out.println("a/b/c/d " + a + "/" + b + "/" + c + "/" + d); // pour contrôle

C'est affreux, il faut trouver une autre solution !!!

Répondre à danimo

17

louna2009, le 2 jui 2009 à 20:35:29

Non c'est pas affreux
je cherche pas un algo optimisé!!
je cherche un algo qui tourne
le code que vous avez proposé tourne tres bien mais ..
comment je fais pour accéder à la 2eme 3eme .... colonnes??

Répondre à louna2009

18

danimo, le 2 jui 2009 à 20:46:23

Je dois m'absenter un moment (ici il est 13:42 PM).
Dès que je rentre je te prépare quelque chose, j'espère que tu seras encore en ligne, mais de toutes manières je poste.

à++

Dan

Répondre à danimo

19

louna2009, le 2 jui 2009 à 20:47:25

Ok et merci infiniement pour votre aide :)))

Répondre à louna2009

8

Herezia, le 2 jui 2009 à 13:40:31

Qui fonctionne peu importe le nombre d'élément par ligne

List<List<Integer>> valeurs = new ArrayList<Integer>();
while ((ligne = br.readLine()) != null) {
	System.out.println(ligne);
	chaine += ligne + "\n";
	String[] valeursTextuelles = ligne.split(" "); // " " équivalent à \s
	List<Integer> valeursLigne = new ArrayList<Integer>();
	if (valeursTextuelles != null)
		for (String valeurTextuelle : valeursTextuelles)
			valeursLigne.add(Integer.parseInt(valeurTextuelle));

	valeurs.add(valeursLigne);
} 


J'ai pas compilé mais ça ne devrait pas poser problème

Cela dit, toute notre conversation ne t'a peut-être servi à rien.
Il y a deux façons d'accéder aux fichiers, soit par flux soit de manière aléatoire.

Dans ton cas tu sembles vouloir accéder à une ligne donnée et en tirer les informations. Il faut alors t'orienter vers des classes telles que RandomAccessFile.

Précise moi si c'est bien ça et on regarde ça

Répondre à Herezia

20

danimo, le 3 jui 2009 à 07:17:42
  • +1

Bonjour,

J'ai choisi d'utiliser la classe StringTokenizer du package java.util.
Et j'utilise le fichie texte qui contient 3 lignes de 9 valeurs au total.

3 45
3 4 6
2 3 67 89

J'ai choisi également d'extraire les 9 valeurs et des les stocker dans un tableau d'int de longueur 9.
En fin de lecture, ces 9 valeurs sont extraites du tableau etcopiées dans les 9 variables a à g (int)

Voici la classe:

import java.io.*;
import java.util.StringTokenizer;

public class ExtractVar
{
public static void main(String[] args)
{
//String chaine = null;
// lecture du fichier texte
try
{
InputStream ips = new FileInputStream("VarAextraire.txt"); // mon fichier texte pour tester
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String ligne;
int tokSv = 0;
int nombreDeVariables = 9; // par exemple les 9 valeurs des 3 lignes de l'exemple
int[] var = new int[nombreDeVariables];

while ((ligne = br.readLine()) != null)
{
System.out.println(ligne); // peut etre supprimé
int tok = tokSv;
StringTokenizer val = new StringTokenizer(ligne," "); // ici point important: ," " indique qu'on utilise le séparateur de mots (de valeurs) espace.

while(val.hasMoreTokens())
{
var[tok] = Integer.parseInt(val.nextToken());
System.out.println("var[" + tok + "] = " + var[tok]); // peut etre supprimé
tok++;
}
tokSv = tok;
}

int a = var[0];
int b = var[1];
int c = var[2];
int d = var[3];
int e = var[4];
int f = var[5];
int g = var[6];
int h = var[7];
int i = var[8];
System.out.println("a/b/c/d/e/f/g/h/i = " + a + "/" + b + "/" + c + "/" + d
+ "/" + e + "/" + f + "/" + g + "/" + h + "/" + i); // pour contrôle

br.close();
}
catch (Exception e) {
System.out.println(e.toString());
}
}
}

Il n'y a pas beaucoup de commentaires, mais n'hésites pas à me poser des questions si certains points sont obscurs.

Cordialement,

Dan

Répondre à danimo

23

louna2009, le 3 jui 2009 à 11:42:08

Merci pour votre aide
je vais tester ce code et je vous contacte s'il y a un probleme
Merci encore une fois!!!

Répondre à louna2009

25

louna2009, le 3 jui 2009 à 15:32:27

Merci infiniement ça marche
un dernier service si ça ne te gene pas biensur:
est ce qu'on peut les recuperer dans une matrice?? (vecteur à 2 dimensions)
comme ça ça sera plus facile d'acceder au contenu souhaité!!

Répondre à louna2009

26

Herezia, le 3 jui 2009 à 15:49:05
  • +1

Si tu veux utiliser des vecteurs penche toi sur la classe java.util.Vector

Pour accéder aux informations comme dans une matrice procède comme suit:

// Pour accéder à la nième ligne de la miène colonne
private Integer getValeur(Integer n, Integer m, List<List<Integer>> valeurs)
{
	if (valeurs.get(n) != null)
		if (valeurs.get(n).size() > m)
			return valeurs.get(n).get(m);
	return -1;
}


Code non vérifié, bonne utilisation, pense à mettre ce sujet en "terminé"

Répondre à Herezia

27

louna2009, le 5 jui 2009 à 15:50:15

Merci infiniement
vous mavez aidé à avancer dans mon memoire de mastere
grace à votre aide!!!
Je suis tres reconnaissante
merciiiiiiii

Répondre à louna2009

28

 Herezia, le 5 jui 2009 à 17:12:11

De rien, bon courage pour ton mémoire !

Répondre à Herezia

21

Herezia, le 3 jui 2009 à 09:15:51

Les tableaux d'entiers sont restrictifs et inadaptés, utilise des instance de java.util.List plutôt
Parce que ta solution limite de 9 le nombre d'entiers par ligne

Sinon le StringTokenizer est une bonne idée mais il faut penser à utiliser un accès aléatoire plutôt que par flux si elle veut accéder à la Nième ligne

(Par contre, j'aurais aimé avoir un retour de ma réponse, savoir si ça a été utile ou non, inutile que je contribue dans le cas contraire...)

Répondre à Herezia

22

louna2009, le 3 jui 2009 à 11:40:41

Bonjour Herezia
desolée jai cru avoir deja repondu à votre message
en fait javais pas compris l'utilité des listes et en plus tu declares une variable de type liste mais tu linitialise à arrayListe ce qui genere deja une erreur...

jai pas su comment corriger ces erreurs!!!

"il faut penser à utiliser un accès aléatoire plutôt que par flux si elle veut accéder à la Nième ligne " c'est ce que je veux aussi!!!

enfin de compte je dois acceder à toutes les valeurs du fichier...
Merci

Répondre à louna2009

24

Herezia, le 3 jui 2009 à 13:56:27

Si tu veux accéder à toutes les valeurs, charge tout en mémoire (si c'est pas trop gros évidemment), en passant par une lecture de flux, BufferedReader et compagnie

Précision: déclarer un objet en List et l'instancier en ArrayList est quelque chose de tout à fait courant. C'est par principe de programmation. Ce dont tu te sers conceptuellement c'est d'une List et pas d'une ArrayList...imaginons que plus tard tu veuilles instancier plutôt une LinkedList ou un Vector et bien tu n'auras juste qu'à changer la déclaration. En effet, l'utilisation de l'interface List garantit l'existence des mêmes méthodes quelque soit sont implémentation (ArrayList, LinkedList ou Vector)

Pour l'erreur déclenchée, ça doit être que tu n'as pas les bons packages d'importés.
Soit tu utilises java.util.List et java.util.ArrayList soit tu en fais un import

Cheers et bon courage tu es bientôt au bout

(PS: tutoie moi)

Répondre à Herezia
Collection CommentÇaMarche.net