Se connecter / S'enregistrer
Votre question

[Résolu] Classer fichier .txt dans tableau java

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
25 Avril 2008 14:10:30

Bonjour à tous !
Comme indiqué, je me lance dans un programme sensé prendre les données présentes dans un fichier texte et les classer dans un tableau. Le fichier est de la forme :
Donnée;Donnée;Donnée;Donnée
Donnée;Donnée;Donnée;Donnée
Donnée;Donnée;Donnée;Donnée
etc.

Mon code est le suivant :
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Classer {
  5.  
  6. public static void main(String[] args)throws IOException{
  7.  
  8. /** Demande d'entrée du nom de fichier à l'utilisateur */
  9. Scanner clavier = new Scanner(System.in);
  10. System.out.println("Saisir le nom du fichier de données (avec son extension .txt) : ");
  11. String fil = clavier.next();
  12.  
  13. try{
  14. FileReader lecteurDeFichier = new FileReader(fil);
  15. BufferedReader buff = new BufferedReader(lecteurDeFichier);
  16.  
  17. System.out.println("Lecture du fichier : "+fil);
  18. //System.out.println(buff.readLine());
  19.  
  20. /** Compte le nombre de données par ligne (= nombre de colonnes) */
  21. //System.out.println(buff.readLine());
  22. String premLigne = buff.readLine();
  23. /** Pour séparer les données, on utilise le tokenizer avec pour délimiteur ";" */
  24. StringTokenizer st = new StringTokenizer(premLigne, ";");
  25. System.out.println("Le fichier "+fil+" contient une liste avec les donnees suivantes : ");
  26. int nbDonnees = 0;
  27. while(st.hasMoreTokens()){
  28. nbDonnees++;
  29. System.out.print(st.nextToken()+" ");
  30. }
  31.  
  32.  
  33. /** Compte le nombre de lignes pour la création du tableau */
  34. int nbLignes = 1;
  35. while(buff.ready()){
  36. buff.readLine();
  37. nbLignes++;
  38. }
  39.  
  40.  
  41. /** Déclaration du tableau */
  42. String[][] tabDonnees = new String[nbLignes][nbDonnees];
  43.  
  44. FileReader lec = new FileReader(fil);
  45. BufferedReader BF = new BufferedReader(lec);
  46.  
  47. /** Rangement des données dans le tableau */
  48. while(BF.ready()){
  49. String line = BF.readLine();
  50. StringTokenizer tok = new StringTokenizer(line, ";");
  51. for(int i = 0; i<nbLignes; i++){
  52. for(int j=0; j<nbDonnees; j++){
  53. if(tok.hasMoreTokens()){
  54. tabDonnees[i][j]=tok.nextToken();
  55. }
  56. }
  57. }
  58. }//Fin while
  59. }//Fin try
  60.  
  61. catch (IOException e){
  62. System.out.println("Erreur : "+e);
  63. }
  64. }//Fin main
  65. }//Fin



Le problème est que je me retrouve avec la dernière ligne du texte dans mon tableau et toutes les autres cases sont null.
D'après ce que j'ai compris c'est parce qu'une fois mon fichier lu, le second buffer ne me permet pas de revenir au début et reparcourir le texte.
Est-ce que quelqu'un voit comment je pourrais faire ?
J'espère avoir été claire...

Merci d'avance :) 

Autres pages sur : resolu classer fichier txt tableau java

25 Avril 2008 14:17:56

tu perds les données de ton buffer lorsque tu comptes le nombre de lignes, pour obtenir les dimensions de ton tableau.

A la place d'un tableau, utilise plutot un ArrayList<String[]>, qui a une taille dynamique.

Et à la place du StringTokenizer, tu peux utiliser line.split(";"); qui renvoit un String[]
1 Mai 2008 12:58:53

Merci de ta réponse, j'ai finalement réussi avec des tableaux unidimensionnels (sans passer par l'étape comptant les lignes)...
Par contre, est-ce que quelqu'un aurait une idée pour enregistrer le tableau créé dans un fichier xhtml ?
Je me suis lancée dans l'étude de Jdom, créer un fichier xml je vois mais quoi utiliser quand, j'ai plus de mal.
Contenus similaires
1 Mai 2008 14:13:49

faitre un fichier xHTML c'est faire un fichier texte donc tu fait un;

  1. OutputStream out = new FileOutputStream("./fichier.html");
  2. out.write("<html>");
  3. out.write("<head>");
  4. etc etc ...


Au passage la solution de Vinz42 et de l'ArrayList était bien plus propre qu'un simple tableau statique surtout si tu n'as pas compter la taille avant. Car comment connais tu la taille de ton tableau lors de l'initialisation ?

FileOutputStream

7 Mai 2008 15:10:48

Merci à tous, j'ai enfin réussi à terminer ce programme !
Je suis entièrement d'accord pour l'ArrayList, le problème est que c'était un TP pour la fac et que donc je n'avais pas trop le choix...

Si jamais quelqu'un bute sur les même problèmes, je mets le code final :

  1. /**
  2. import java.io.*;
  3. import java.util.*;
  4.  
  5. public class AlgoTP4 {
  6.  
  7. /** Déclaration de tableaux individuels pour chaque donnée */
  8. static String[] Nom = new String [29];
  9. static String[] Prenom = new String [29];
  10. static String[] Annee = new String [29];
  11. static String[] Email = new String [29];
  12.  
  13. /**
  14. * Méthode permettant de lire un fichier et de séparer les données
  15. * avant de les ranger dans des tableaux à une dimension
  16. * Chaque type de donnée est rangé dans un tableau spécifique.
  17. *
  18. * @param fil Le fichier à charger
  19. * @throws IOException
  20. */
  21. public static void recDonnees(String fil)throws IOException {
  22. try{
  23. /** Lecture de ce fichier */
  24. File fichier = new File(fil);
  25. FileReader lecteurDeFichier = new FileReader(fichier);
  26. BufferedReader buff = new BufferedReader(lecteurDeFichier);
  27. String ligne;
  28.  
  29. ligne = buff.readLine();
  30.  
  31. String Donnee1;
  32. String Donnee2;
  33. String Donnee3;
  34. String Donnee4;
  35. int count = 0;
  36. /** Tant qu'on n'arrive pas à la longueur max d'un tableau, on le remplit */
  37. while (count < 29) {
  38. ligne = buff.readLine();
  39. java.util.StringTokenizer coupeur = new java.util.StringTokenizer(ligne,";");
  40. Donnee1 = coupeur.nextToken();
  41. Donnee2 = coupeur.nextToken();
  42. Donnee3 = coupeur.nextToken();
  43. Donnee4 = coupeur.nextToken();
  44.  
  45. Nom [count] = Donnee1;
  46. Prenom[count] = Donnee2;
  47. Annee[count] = Donnee3;
  48. Email [count] = Donnee4;
  49. count ++;
  50. }//Fin while
  51. buff.close(); /** Fermeture du buffer */
  52.  
  53. System.out.println("Votre fichier a bien été pris en compte");
  54. }//fin try
  55. catch(IOException err) {
  56. System.out.println("Erreur : " +err);
  57. }//fin catch
  58. }
  59.  
  60. /**
  61. * Méthode de tri à bulles : modifie le tableau passé en paramètre pour classer tous ses éléments
  62. * en ordre croissant et réalise les mêmes mouvements pour les autres données.
  63. *
  64. * @param tableau Le tableau contenant la donnée à trier en ordre croissant
  65. */
  66. public static void TriCroissant(String tableau[]){
  67. String tmpNom;
  68. String tmpPrenom;
  69. String tmpAnnee;
  70. String tmpEmail;
  71. for(int i=0;i<tableau.length;i++)
  72. for(int j=0;j<Nom.length-1;j++)
  73. {
  74. if(tableau[j].compareTo(tableau[j+1])>0)
  75. {
  76. tmpNom=Nom[j+1];
  77. Nom[j+1]=Nom[j];
  78. Nom[j]=tmpNom;
  79.  
  80. tmpPrenom=Prenom[j+1];
  81. Prenom[j+1]=Prenom[j];
  82. Prenom[j]=tmpPrenom;
  83.  
  84. tmpAnnee=Annee[j+1];
  85. Annee[j+1]=Annee[j];
  86. Annee[j]=tmpAnnee;
  87.  
  88. tmpEmail=Email[j+1];
  89. Email[j+1]=Email[j];
  90. Email[j]=tmpEmail;
  91. }
  92. }
  93. }
  94.  
  95. /**
  96. * Méthode de tri à bulles : modifie le tableau passé en paramètre pour classer tous ses éléments
  97. * en ordre décroissant et réalise les mêmes mouvements pour les autres données.
  98. *
  99. * @param tableau Le tableau contenant la donnée à trier en ordre décroissant
  100. */
  101. public static void TriDecroissant(String tableau[]){
  102. String tmpNom;
  103. String tmpPrenom;
  104. String tmpAnnee;
  105. String tmpEmail;
  106. for(int i=0;i<tableau.length;i++)
  107. for(int j=0;j<Nom.length-1;j++)
  108. {
  109. if(tableau[j].compareTo(tableau[j+1])<0)
  110. {
  111. tmpNom=Nom[j+1];
  112. Nom[j+1]=Nom[j];
  113. Nom[j]=tmpNom;
  114.  
  115. tmpPrenom=Prenom[j+1];
  116. Prenom[j+1]=Prenom[j];
  117. Prenom[j]=tmpPrenom;
  118.  
  119. tmpAnnee=Annee[j+1];
  120. Annee[j+1]=Annee[j];
  121. Annee[j]=tmpAnnee;
  122.  
  123. tmpEmail=Email[j+1];
  124. Email[j+1]=Email[j];
  125. Email[j]=tmpEmail;
  126. }
  127. }
  128. }
  129.  
  130. /**
  131. * Méthode chargée de créer un fichier html avec les données de chaque
  132. * tableau ordonnées en un seul tableau récapitulatif
  133. *
  134. * @throws IOException
  135. */
  136. public static void creerHtml()throws IOException{
  137. System.out.println("Les donnees ont bien ete triees.");
  138. System.out.println("Elles vont maintenant etre sauvegardees dans un tableau html.");
  139. System.out.println("Merci de bien vouloir specifier un nom pour ce fichier de sauvegarde (n'oubliez pas l'extension .html !) :");
  140.  
  141. Scanner in = new Scanner(System.in);
  142. String FichierSortie = in.next();
  143. FileWriter sortie = new FileWriter(FichierSortie);
  144. BufferedWriter BW = new BufferedWriter(sortie);
  145. BW.write("<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' '<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="nofollow" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>'>" +"\r\n");
  146. BW.write("<HTML xmlns='<a href="http://www.w3.org/1999/xhtml" rel="nofollow" target="_blank">http://www.w3.org/1999/xhtml</a>' xml:lang='fr'>" +"\r\n");
  147. BW.write("<HEAD>"+"\r\n");
  148. BW.write("<TITLE>");
  149. BW.write("TP4 - Manipulation de fichier texte, chaînes de caractères et tri");
  150. BW.write("</TITLE>");
  151. BW.write("</HEAD>"+"\r\n");
  152. BW.write("<BODY>"+"\r\n");
  153. BW.write("<TABLE BORDER>"+"\r\n");
  154. BW.write("<TR>"+"\r\n");
  155. BW.write("<TD>"+"\r\n");
  156. BW.write("Nom");
  157. BW.write("</TD>"+"\r\n");
  158. BW.write("<TD>"+"\r\n");
  159. BW.write("Prenom");
  160. BW.write("</TD>"+"\r\n");
  161. BW.write("<TD>"+"\r\n");
  162. BW.write("Annee");
  163. BW.write("</TD>"+"\r\n");
  164. BW.write("<TD>"+"\r\n");
  165. BW.write("E-mail");
  166. BW.write("</TD>"+"\r\n");
  167. BW.write("</TR>"+"\r\n");
  168. BW.write("<TR>"+"\r\n");
  169.  
  170. /** Boucle permettant l'insertion des données contenues dans les tableaux */
  171. for(int i=0;i<29;i++){
  172. BW.write("<TD>"+"\r\n");
  173. BW.write(Nom[i]+ "\r\n");
  174. BW.write("</TD>"+"\r\n");
  175. BW.write("<TD>"+"\r\n");
  176. BW.write(Prenom[i]+ "\r\n");
  177. BW.write("</TD>"+"\r\n");
  178. BW.write("<TD>"+"\r\n");
  179. BW.write(Annee[i]+ "\r\n");
  180. BW.write("</TD>"+"\r\n");
  181. BW.write("<TD>"+"\r\n");
  182. BW.write(Email[i]+ "\r\n");
  183. BW.write("</TD>"+"\r\n");
  184. BW.write("</TR>"+"\r\n");
  185. }
  186.  
  187. BW.write("<TABLE BORDER>"+"\r\n");
  188. BW.write("</BODY>"+"\r\n");
  189. BW.write("</HTML>"+"\r\n");
  190. System.out.println();
  191. System.out.println("Le fichier a ete enregistre dans le repertoire courant");
  192. System.out.println("Vous pouvez des a present proceder a un nouveau tri");
  193. System.out.println();
  194. System.out.println();
  195. BW.close();
  196. }
  197.  
  198. public static void main(String[]args)throws IOException{
  199. /** Demande d'entrée du nom de fichier à l'utilisateur */
  200. Scanner clavier = new Scanner(System.in);
  201. System.out.println("Saisir le nom du fichier de donnees (avec son extension .txt) : ");
  202. String fil = clavier.next();
  203.  
  204. recDonnees(fil);
  205.  
  206. int Read0=0;
  207. BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
  208.  
  209. while (Read0!=9)
  210. {
  211. System.out.println("Merci de bien vouloir spécifier le tri que vous souhaitez appliquer : ");
  212. System.out.println("(1) Tri par nom croissant");
  213. System.out.println("(2) Tri par nom decroissant");
  214. System.out.println("(3) Tri par prenom croisant");
  215. System.out.println("(4) Tri par prenom decroissant");
  216. System.out.println("(5) Tri par annee croissant");
  217. System.out.println("(6) Tri par annee decroissant");
  218. System.out.println("(7) Tri par e-mail croissant");
  219. System.out.println("(8) Tri par e-mail decroissant");
  220. System.out.println("(9) --Fin--");
  221. System.out.println("Votre choix : ");
  222.  
  223. String lireEntree0;
  224. lireEntree0 = entree.readLine();
  225. Read0=Integer.parseInt(lireEntree0);
  226.  
  227. switch(Read0)
  228. {
  229. case 1 :
  230. {
  231. TriCroissant(Nom);
  232. creerHtml();
  233. break;
  234. }
  235. case 2 :
  236. {
  237. TriDecroissant(Nom);
  238. creerHtml();
  239. break;
  240. }
  241. case 3 :
  242. {
  243. TriCroissant(Prenom);
  244. creerHtml();
  245. break;
  246. }
  247. case 4 :
  248. {
  249. TriDecroissant(Prenom);
  250. creerHtml();
  251. break;
  252. }
  253. case 5 :
  254. {
  255. TriCroissant(Annee);
  256. creerHtml();
  257. break;
  258. }
  259. case 6 :
  260. {
  261. TriDecroissant(Annee);
  262. creerHtml();
  263. break;
  264. }
  265. case 7 :
  266. {
  267. TriCroissant(Email);
  268. creerHtml();
  269. break;
  270. }
  271. case 8 :
  272. {
  273. TriDecroissant(Email);
  274. creerHtml();
  275. break;
  276. }
  277.  
  278. default :
  279. {
  280. Read0=9;
  281. System.out.println("Merci d'avoir utilise ce programme !");
  282. break;
  283. }
  284.  
  285. }
  286.  
  287. }
  288. }
  289.  
  290. }
7 Mai 2008 15:23:05

Est-ce que tu peux donner un exemple de fichier texte stp.
7 Mai 2008 15:36:04

Le fichier est de la forme :

Citation :
Nom;Prénom;Annee;E-mail
Garcia;Lucas;1980;rifinique.dlddee@bduetrn.ch
Blanc;Mathilde;1972;aired@ribin.ch
Serra;Pauline;1964;rifain.figw@redefint.ch
Guisset;Thomas;1988;ksanba@bduetrn.ch
Martinez;Enzo;1976;ucreftJP@ch.ch
7 Mai 2008 15:41:49

c'est quand même un peu limite ton programme...
il accepte seulement des fichier avec 29 noms....

et tu es case sensitive.
genre, sur un tri croissant, tu met monsieur "barcia" après monsieur "Serra".
25 Juin 2009 19:59:39

MErci c'est tres gentille pour ton code finial comment puis-je l'adapter a mon cas en effet je prog en Java depuis maintenant 1 Mois et dans le cadre de ma formation je dois crée un connecteur et il doit y avoir un relatio nentre un fichier .txt et le programme en effet le programe doit aller cherche les donner telle que le login et le passe pour pouvoir se connecter.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS