Lire un document texte en java

Résolu/Fermé
botubuntu Messages postés 15 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 20 juin 2010 - 19 avril 2010 à 02:13
 princesse - 20 déc. 2012 à 17:39
bonsoir tout le monde,
j'ai un document texte ayant cette forme :

AM = STA
,numCIN = 3 ,nbr = 3 ,TYSM = 1
,NCVA = 1 ,groupe = A
,STB = 1-3-1 ,AR = 71-1
STBA=1-3-1-71
RAIN=1 CA=AE5V40 SF=CV5 RGSF=0 RGCA=0
STBA=1-3-1-71
RAIN=1 CA=AE5V40 SF=CV5 RGSF=0 RGCA=0
RAIN=10 CA=AE5V40 SF=CV4 RGSF=1 RGCA=1
AM = STT
,numCIN = 22 ,nbr = 2 ,TYSM = 5
,NCVA = 1 ,groupe = A
,STB = 1-3-1 ,AR = 71-1
STBA=1-3-1-71
RAIN=1 CA=AE5V40 SF=CV3 RGSF=2 RGCA=0
on remarque dans ce fichier que il y'a un bloc qui se repete AM= ... jusqu'a atteindre la seconde AM tout en respectant la meme forme. le but du programme est de créer un tableau et le remplir à partir de ce texte tout en mettant chaque AM dans un ligne et les autres champs correspondants ( numCIN , CA , nbr ...) en tant que colonnes.
j'espere que vous pourriez m'aider et merci d'avance .

A voir également:

3 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
19 avril 2010 à 11:22
Bonjour,

Pour ce qui est de savoir comment lire un fichier Texte en Java, tu trouvera plein de tutoriaux là dessus sur internet.

Je passe donc directement à la partie "algorithmie", qui te sera plus utile:

Pour résoudre ton problème, tu peux par exemple lire ton fichier ligne par ligne.
Ensuite il te reste à traiter chaque ligne une à une.

Que sais-tu de ces lignes en regardant ton fichier:
- que chaque champ est séparé soit par une virgule, soit par un espace, soit les deux, mais de toute manière, toujours par un espace (que la virgule soit présente ou non)

Il faut donc traiter ton fichier ligne par ligne, puis champ par champ.

Pour chaque ligne, comment récupérer les champs et leur valeur ?
Simple, tu récupère ta ligne comme une String et sur cette String tu va appliquer des contrôles.
1- Suppression des virgules
2- Couper la String en tableau de String via le séparateur "espace" pour ainsi récupérer un tableau de String contenant des String de la forme champ=valeur
3- Boucler sur ce tableau de String, pour y récupérer le nom du champ ainsi que sa valeur (en coupant la String sur le caracètre '='

Ca s'est pour traiter ton fichier. Reste à l'interpréter.

Pour stocker et traiter les champs ainsi récupérer, le mieux je pense est de créer une classe "Champ" dans laquelle tu y met le nom et la valeur (en temps que propriétés de classe)
Dans ton programme chargé de lire le fichier et récupérer les champs, tu auras alors juste à gérer une liste d'objet 'Champ', que tu rempli au fur et à mesure que tu trouve des champs, et que tu "traite" dès que tu tombe sur une champ de type 'AM'.

Lorsque tu tombe sur un champ de type 'AM', tu vas regarder si ta liste d'objet Champ est vide ou non.
Si elle n'est pas vide, tu la traite (c'est à dire que tu créera une ligne de ton tableau avec l'ensemble des objets Champ de cette liste). Une fois traitée, tu la réinitialise en la vidant.
Et ainsi de suite, à chaque AM, la liste sera traitée puis vidée, puis remplie à nouveau au fil du traitement du fichier texte.

J'espère que mes explications n'ont pas été trop 'brouillon'.
Auquel cas hésite pas à poser des questions précises sur que tu n'as pas compris.

Fais déjà cette partie du programme, ce sera une bonne chose.
Pour ce qui est de l'écriture de ton fichier / tableau de sortie (si j'ai bien compris tu souhaite créer un fichier en sortie, de type Excel dans lequel chaque ligne de données correspond à la suite des valeurs d'un AM.
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 avril 2010 à 17:14
Re,

Alors voilà, j'ai fais le programme pour que tu y vois plus clair sur la manière de coder "correctement" en Java.

Le programme se compose de plusieurs classe comprise dans ce que l'on nomme des 'packages'.

Voici la liste et le code de chaque classes:

Classe 'AMException.java' (package 'org.sample'):

package org.sample;

public class AMException extends Exception {

	/****************/
	/** CONSTANTES **/
	/****************/
	
	public static String BAD_ARGS_FORMAT	=	"Incorrect number of arguments, USAGE: ProcessAMFile [source file path]";

	/****************/
	/** PROPERTIES **/
	/****************/
	
	private String message	=	null;

	/*****************/
	/** CONSTRUCTOR **/
	/*****************/
	/**
	 * AMException
	 * Default class constructor
	 * @param theMessage String
	 */
	public AMException (String theMessage){
		super();
		setMessage(theMessage);
	}

	/***********************/
	/** GETTERS & SETTERS **/
	/***********************/
	
	/**
	 * setMessage
	 * Set 'message' property value
	 * @param theMessage String
	 */
	private void setMessage (String theMessage){
		this.message = theMessage;
	}
	
	/**
	 * getMessage
	 * Get 'message' property value
	 * @return String
	 */ 
	public String getMessage (){
		return this.message;
	}
	
}



Classe 'Field.java' (package 'org.sample.bean'):

package org.sample.bean;

public class Field {

	/****************/
	/** PROPERTIES **/
	/****************/
	
	private String name		=	null;
	private String value	=	null;
	
	/*****************/
	/** CONSTRUCTOR **/
	/*****************/

	/**
	 * Field
	 * Default class constructor
	 * @param theName String
	 * @param theValue String
	 */
	public Field (String theName, String theValue){
		setName(theName);
		setValue(theValue);
	}
	
	/*************/
	/** METHODS **/
	/*************/

	/***********************/
	/** GETTERS & SETTERS **/
	/***********************/
	
	/**
	 * setName
	 * Set 'name' property value
	 * @param theName String
	 */
	public void setName (String theName){
		this.name = theName;
	}
	
	/**
	 * getName
	 * Get 'name' property value
	 * @return String
	 */
	public String getName (){
		return this.name;
	}
	
	/**
	 * setValue
	 * Set 'value' property value
	 * @param theValue String
	 */
	public void setValue (String theValue){
		this.value = theValue;
	}
	
	/**
	 * getValue
	 * Get 'value' property value
	 * @return String
	 */
	public String getValue (){
		return this.value;
	}
}



Classe 'Reader.java' (package 'org.sample.inout') :

package org.sample.inout;

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

public class Reader {

	/****************/
	/** PROPERTIES **/
	/****************/
	
	private BufferedReader reader = null;
	

	/*****************/
	/** CONSTRUCTOR **/
	/*****************/

	/*************/
	/** METHODS **/
	/*************/
	
	/**
	 * openFile
	 * Open a file to read it
	 * @param theFilePath String
	 * @throws IOException
	 */
	public void openFile (String theFilePath) throws IOException {
		InputStream myIps = new FileInputStream(theFilePath);
		InputStreamReader myIpsr = new InputStreamReader(myIps);
		reader = new BufferedReader(myIpsr);
	}
	
	/**
	 * closeFile
	 * Close current stream on input file
	 * @throws IOException
	 */
	public void closeFile () throws IOException {
		if ( getReader() != null ){
			getReader().close();
		}
	}
	
	/**
	 * getLine
	 * Get next line from opened file content
	 * @return String
	 */
	public String getLine () {
		if ( getReader() != null ){
			try{
				return getReader().readLine();
			}catch(IOException e){
			}
		}
		// --- In case of IO Error, return null
		return null;
	}
	

	/***********************/
	/** GETTERS & SETTERS **/
	/***********************/
	
	/**
	 * setReader
	 * Set 'reader' property value
	 * @param theStream BufferedReader
	 */
	public void setReader (BufferedReader theStream){
		this.reader = theStream;
	}
	
	/**
	 * getReader
	 * Get 'reader' property value
	 * @return BufferedReader
	 */
	public BufferedReader getReader (){
		return this.reader;
	}
	
}



Classe 'FileManager.java' (package 'org.sample.process') :

package org.sample.process;

import java.util.ArrayList;

import org.sample.bean.Field;

public class FileManager {

	/****************/
	/** PROPERTIES **/
	/****************/
	
	private ArrayList fieldsList	=	null;
	

	/*****************/
	/** CONSTRUCTOR **/
	/*****************/
	
	/**
	 * FileManager
	 * Default class constructor
	 */
	public FileManager (){
		// --- Initialize the field list
		setFieldsList(new ArrayList());
	}

	/*************/
	/** METHODS **/
	/*************/
	
	/**
	 * parseLine
	 * Parse the data to register all fields contained by a line
	 * Line is structured as follow:
	 * Case1: , name = file, name = file, ...
	 * Case2: name=file name=file name=file
	 * @param theLine String
	 */
	public void parseLine (String theLine){
		
		// --- Split the line by the space to have fields name and value
		String[] myFieldAndValues = null;
		String[] myCurrNameAndVal = null;
		String myCurrFieldData = null;
		
		if ( theLine.trim().startsWith("AM")){
			myFieldAndValues = new String[]{ theLine };
		}
		// --- Presence of character ',' in the line, parse with solution 1 (',' character)
		else if ( theLine.indexOf(",") != -1 ){
			myFieldAndValues = theLine.split(",");
		}
		// ---- Non presence of character ',' in the line, parse with solution 2 (space character)
		else {
			myFieldAndValues = theLine.split(" ");
		}
		
		// --- Roll on the list
		for (int i = 0; i < myFieldAndValues.length; i++){
			// --- Split by character '='
			myCurrNameAndVal = myFieldAndValues[i].split("=");
			// --- Treat data only if character "=" found and data split
			if ( myCurrNameAndVal.length == 2 ){
				// --- Check name of the field
				if ( myCurrNameAndVal[0].trim().equalsIgnoreCase("AM") ){
					// --- Treat previous list of field if exist (field list not empty
					if ( getFieldsList() != null && getFieldsList().size() > 0 ){
						treatFieldList();
					}
				}
				// --- Add current field into the list
				getFieldsList().add( new Field(myCurrNameAndVal[0],myCurrNameAndVal[1]) );
			}
			else{
				// --- Write an warning message on the output
				System.out.println("[parseLine] Warning, data doesn't contain character '=' (or more than one). Can't treat the following data : "+myFieldAndValues[i]);
			}
		}
		
	}
	
	/**
	 * treatFieldList
	 */
	public void treatFieldList (){
		
		// --- @TODO:
		System.out.println("[treatFieldList] AM line content to write in output file :");
		for (int i = 0; i < getFieldsList().size(); i++){
			System.out.println("\t\t-----------------");
			System.out.println("\t\tField name  : "+((Field)getFieldsList().get(i)).getName());
			System.out.println("\t\tField value : "+((Field)getFieldsList().get(i)).getValue());
		}
		
		// --- Remove all fields object from the list
		getFieldsList().clear();
		
	}

	/***********************/
	/** GETTERS & SETTERS **/
	/***********************/
	
	
	/**
	 * setFieldsList
	 * Set 'fieldsList' property value
	 * @param theList ArrayList
	 */
	public void setFieldsList (ArrayList theList){
		this.fieldsList = theList;
	}
	
	/**
	 * getFieldsList
	 * Get 'fieldsList' property value
	 * @return ArrayList
	 */
	public ArrayList getFieldsList (){
		return this.fieldsList;
	}
	
}



Et enfin, la classe 'ProcessAMFile.java' (package 'org.sample.process') :

package org.sample.process;

import java.io.IOException;

import org.sample.AMException;
import org.sample.inout.Reader;

public class ProcessAMFile {

	
	/****************/
	/** PROPERTIES **/
	/****************/
	
	/** Path of the file to read **/
	private String filePath	=	null;
	/** Object to read the file **/
	private Reader reader	=	null;
	/** File manager object **/
	private FileManager manager	= null;
	

	/*****************/
	/** CONSTRUCTOR **/
	/*****************/
	
	/**
	 * ProcessAMFile
	 * Default class constructor
	 */
	public ProcessAMFile (){
		// --- Instantiate reader object
		setReader(new Reader());
		// --- Instantiate the file manager object
		setManager(new FileManager());
	}
	
	/*************/
	/** METHODS **/
	/*************/
	
	/**
	 * init
	 * Check program arguments.
	 * args[0] must be the path of the file to read.
	 * @param args String[]
	 * @throws AMException
	 */
	public void init (String[] args) throws AMException {
		if ( args.length < 1 ){
			throw new AMException(AMException.BAD_ARGS_FORMAT);
		}
		// --- Treat argument 1 as the path of the file to read
		setFilePath(args[0]);
	}
	
	/**
	 * process
	 * Main program process. Read and treat the input file
	 * @throws AMException
	 */
	public void process () throws AMException {
		
		// --- 1°) Open the file to read
		try{
			getReader().openFile(getFilePath());
		}catch(IOException e){
			// --- Throw exception if it failed
			throw new AMException("Failed to open file, cause: "+e.getMessage());
		}
		
		// --- 2°) Read & treat content of the file
		
		String myCurrentLine = getReader().getLine();
		// --- While reading line is possible, treat the retrieved data
		while (myCurrentLine != null){
			
			// --- Parse the line
			getManager().parseLine(myCurrentLine);
			
			// --- Read next line from the file
			myCurrentLine = getReader().getLine();
		}
		// --- Treat last field list if not empty
		getManager().treatFieldList();
		
		// --- 3°) Close the file
		try{
			getReader().closeFile();
		}catch(IOException e){
			// --- Throw exception if it failed
			throw new AMException("Failed to close file, cause: "+e.getMessage());
		}
		
	}


	/**
	 * main
	 * Program entry
	 * @param args String[]
	 */
	public static void main (String[] args){
		
		ProcessAMFile myProcess = new ProcessAMFile();
		
		try{
			
			// --- Initialize process arguments
			myProcess.init(args);
			
			// --- Launch the process
			myProcess.process();
			
		}catch(AMException e){
			System.out.println("[main] Error : "+e.getMessage());
		}
		
	}
	
	/***********************/
	/** GETTERS & SETTERS **/
	/***********************/
	
	/**
	 * setFilePath
	 * Set 'filePath' property value
	 * @param theFilePath String
	 */
	private void setFilePath (String theFilePath){
		this.filePath = theFilePath;
	}
	
	/**
	 * getFilePath
	 * Get 'filePath' property value
	 * @return String
	 */
	public String getFilePath (){
		return this.filePath;
	}
	
	/**
	 * setReader
	 * Set 'reader' property value
	 * @param theReader Reader
	 */
	private void setReader (Reader theReader){
		this.reader = theReader;
	}
	
	/**
	 * getReader
	 * Get 'reader' property value
	 * @return Reader
	 */
	public Reader getReader (){
		return this.reader;
	}
	
	/**
	 * setManager
	 * Set 'manager' property value
	 * @param theManager FileManager
	 */
	public void setManager (FileManager theManager){
		this.manager = theManager;
	}
	
	/**
	 * getManager
	 * Get 'manager' property value
	 * @return FileManager
	 */
	public FileManager getManager (){
		return this.manager;
	}
	
}




Explications:
Le point d'entrée du programe est la classe 'ProcessAMFile', méthode 'main'. Cette méthode prends en argument le chemin du fichier à lire et traiter.

A toi d'explorer le programme et le comprendre pour voir comment j'ai fais pour coder la solution que je t'ai proposé plus haut.
Il reste encore à faire dasn ce programme une partie du problème : écrire dans un fichier de sortie, chaque ligne récupérée du fichier d'entrée.
Pour le moment le programme écrit simplement en sortie ce qu'il a décrypté.

Porgramme testé chez moi, devrait donc fonctionner aussi chez toi.

Attention, la notion de package est à connaitre.

Fais moi signe si tu as des difficultés.

1
botubuntu Messages postés 15 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 20 juin 2010
21 avril 2010 à 00:27
bonsoir,
merci beaucoup kij_82 pour m'avoir aider ^^.
j'ai fait quelques recherches sur le net et j'ai essayer de suivre vos conseils et je suis parvenue à ecrire ce code ( je l'ai pa encore testé) c mon premier programme en java j'espere que vous pouvez m'aider à corriger les carences . merci d'avance
import java.io.*; 
import java.util.*; 
import java.util.StringTokenizer; 

public class nouvdoc { 

public static void main(String[] args)throws IOException{ 

string ligne ;
String fichier = SMIL.txt; 
/** Déclaration du tableau */ 

String[][] tabDonnees = new String[nbLignes][nbDonnees]; 

/**lecture du fichier texte */	
try{
InputStream ips=new FileInputStream(fichier); 
InputStreamReader ipsr=new InputStreamReader(ips);
BufferedReader buff=new BufferedReader(ipsr);
String ligne;
while ((ligne=buff.readLine())!=null){
		System.out.println(ligne);
		chaine+=ligne+"\n";
		}
	
/** Compte le nombre de lignes pour la création du tableau */

int nbLignes = 1; 
while(buff.ready() == AM){ 
buff.readLine(); 


/**recuperation des lignes autant que string */
String AM ;
String NCVA ;
String TYSM ;
Int nbr ;
ligne.substring (ligne, indexOf ("AM")) , ligne.substring (indexOf ("numCIN"))
Ligne.substring (ligne, indexOf ("nbr")) , ligne.substring (ligne, indexOf ("nbr")) , ligne.substring (ligne, indexOf ("TYSM")) , ligne.substring (ligne, indexOf ("NCVA")) , ligne.substring (ligne, indexOf ("nbr"))   ;

//separation des mots et rangement des données dans le tableau 

StringTokenizer st = new StringTokenizer ( ligne);
while(buff.ready()){ 
String ligne = buff.readLine(); 
for(int i = 0; i<nbLignes; i++){
For ( int j=0; j< st.coutTokens ( ) , j++)
{
String elem = st.nextCount.trim( ) ;
// maintenant on va séparer la clef de la valeur

StringTokenizer st = StringTokenizer ( elem, "=")
If (st.countTokens != 2) continue ;
String clef = st.nextToken ( ) ;
String valeur = st.nextToken ( ) ;
if(st.hasMoreTokens()){ 
tabDonnees[i][j]= st.nextToken(); 
} 
}
nbLignes++; 
}
} 
}//Fin try
buff.close(); 
	}		
	catch (Exception e){
		System.out.println(e.toString());
	} 
}
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
Modifié par kij_82 le 21/04/2010 à 16:22
Oulala... :)

Toi tu as certainement déjà fait du C, mais concernant le Java et la programmation Objet ce n'est pas encore ça.
Je te conseille de lire des tutoriaux sur la programmation Objet (peu importe que ce soit relié ou non à Java) pour apprendre à concevoir un programme orienté Objet, et non "linéaire" comme en C.

Ton programme est faux, tu as du reprendre et copier / coller un exemple du net pour ce qui est de la lecture de ton fichier. Dans ta première boucle while, le fichier est lu en entier. Dès lors, suite à cette boucle, tu auras beau tenter de lire autre chose dans le fichier, étant donné que tu auras déjà tout lu, tu n'y arrivera pas (rien n'en ressortira du moins)

A coté de ça, je regarde d'un peu plus prêt ton code, je vais essayer de te faire un exemple concret pour te guider.
0
botubuntu Messages postés 15 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 20 juin 2010
27 avril 2010 à 01:53
bonsoir ,
je suis trééééééés désolée pour le retard :s mais j'étais malade :s bon j'ai lu ton message c'est genial ce que t'as programmé :)) merci bien pour ton aide . :)
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
27 avril 2010 à 10:31
Il reste cependant la partie écriture dans le fichier Excel à faire (si c'est bien ça qu'il faut faire)
Si mes souvenirs sont bon j'ai mis un commentaire là où ça devra être traité dans le programme.

A toi de jouer pour la suite donc.
0
botubuntu Messages postés 15 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 20 juin 2010
29 avril 2010 à 14:20
bonjour kij_82,
si vous avez mentioné ça dans un commentaire :) merci beaucoup!
0
bonjour,
je veux savoir comment faire pour la lecture de plusieurs fichiers texte non seulement un seul.
merciii
0