Tom's Guide > Forum > Programmation > [Résolu] Classer fichier .txt dans tableau java

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

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

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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 :

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


Message édité par Youp74 le 07-05-2008 à 15:33:54
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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[]

------------------------------ Don't panic!
mouths91 à dit : "[...]des rageux comme kelnem"
Répondre à Vinz42

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.

Répondre à Youp74

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

Code :
  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

------------------------------ 20minutes.fr, l'information en continu.
Répondre à SiM07

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 :

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

Répondre à Youp74

Est-ce que tu peux donner un exemple de fichier texte stp.

------------------------------ Don't panic!
mouths91 à dit : "[...]des rageux comme kelnem"
Répondre à Vinz42

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

Répondre à Youp74

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".


Message édité par Vinz42 le 07-05-2008 à 15:51:03
------------------------------ Don't panic!
mouths91 à dit : "[...]des rageux comme kelnem"
Répondre à Vinz42

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.

Répondre à fabfab42
Tom's Guide > Forum > Programmation > [Résolu] Classer fichier .txt dans tableau java
Aller à :

Il y a 2469 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Liens