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
princesse - 20 déc. 2012 à 17:39
A voir également:
- Lire un document texte en java
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Lire epub - Guide
- Transcription audio en texte word gratuit - Guide
3 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
19 avril 2010 à 11:22
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.
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.
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
21 avril 2010 à 17:14
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'):
Classe 'Field.java' (package 'org.sample.bean'):
Classe 'Reader.java' (package 'org.sample.inout') :
Classe 'FileManager.java' (package 'org.sample.process') :
Et enfin, la classe 'ProcessAMFile.java' (package 'org.sample.process') :
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.
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.
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
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
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()); } }
kij_82
Messages postés
4089
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
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.
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.
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
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 . :)
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 . :)
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
27 avril 2010 à 10:31
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.
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.
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
29 avril 2010 à 14:20
bonjour kij_82,
si vous avez mentioné ça dans un commentaire :) merci beaucoup!
si vous avez mentioné ça dans un commentaire :) merci beaucoup!