[Résolu] Classer fichier .txt dans tableau java
Dernière réponse : dans Programmation
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 :
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
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 :
import java.io.*;
import java.util.*;
public class Classer {
public static void main(String[] args)throws IOException{
/** Demande d'entrée du nom de fichier à l'utilisateur */
Scanner clavier = new Scanner(System.in);
System.out.println("Saisir le nom du fichier de données (avec son extension .txt) : ");
String fil = clavier.next();
try{
FileReader lecteurDeFichier = new FileReader(fil);
BufferedReader buff = new BufferedReader(lecteurDeFichier);
System.out.println("Lecture du fichier : "+fil);
//System.out.println(buff.readLine());
/** Compte le nombre de données par ligne (= nombre de colonnes) */
//System.out.println(buff.readLine());
String premLigne = buff.readLine();
/** Pour séparer les données, on utilise le tokenizer avec pour délimiteur ";" */
StringTokenizer st = new StringTokenizer(premLigne, ";");
System.out.println("Le fichier "+fil+" contient une liste avec les donnees suivantes : ");
int nbDonnees = 0;
while(st.hasMoreTokens()){
nbDonnees++;
System.out.print(st.nextToken()+" ");
}
/** Compte le nombre de lignes pour la création du tableau */
int nbLignes = 1;
while(buff.ready()){
buff.readLine();
nbLignes++;
}
/** Déclaration du tableau */
String[][] tabDonnees = new String[nbLignes][nbDonnees];
FileReader lec = new FileReader(fil);
BufferedReader BF = new BufferedReader(lec);
/** Rangement des données dans le tableau */
while(BF.ready()){
String line = BF.readLine();
StringTokenizer tok = new StringTokenizer(line, ";");
for(int i = 0; i<nbLignes; i++){
for(int j=0; j<nbDonnees; j++){
if(tok.hasMoreTokens()){
tabDonnees[i][j]=tok.nextToken();
}
}
}
}//Fin while
}//Fin try
catch (IOException e){
System.out.println("Erreur : "+e);
}
}//Fin main
}//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
Lassé par la pub ? Créez un compte
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[]
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[]
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.
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.
faitre un fichier xHTML c'est faire un fichier texte donc tu fait un;
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
OutputStream out = new FileOutputStream("./fichier.html");
out.write("<html>");
out.write("<head>");
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
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 :
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 :
/**
import java.io.*;
import java.util.*;
public class AlgoTP4 {
/** Déclaration de tableaux individuels pour chaque donnée */
static String[] Nom = new String [29];
static String[] Prenom = new String [29];
static String[] Annee = new String [29];
static String[] Email = new String [29];
/**
* Méthode permettant de lire un fichier et de séparer les données
* avant de les ranger dans des tableaux à une dimension
* Chaque type de donnée est rangé dans un tableau spécifique.
*
* @param fil Le fichier à charger
* @throws IOException
*/
public static void recDonnees(String fil)throws IOException {
try{
/** Lecture de ce fichier */
File fichier = new File(fil);
FileReader lecteurDeFichier = new FileReader(fichier);
BufferedReader buff = new BufferedReader(lecteurDeFichier);
String ligne;
ligne = buff.readLine();
String Donnee1;
String Donnee2;
String Donnee3;
String Donnee4;
int count = 0;
/** Tant qu'on n'arrive pas à la longueur max d'un tableau, on le remplit */
while (count < 29) {
ligne = buff.readLine();
java.util.StringTokenizer coupeur = new java.util.StringTokenizer(ligne,";");
Donnee1 = coupeur.nextToken();
Donnee2 = coupeur.nextToken();
Donnee3 = coupeur.nextToken();
Donnee4 = coupeur.nextToken();
Nom [count] = Donnee1;
Prenom[count] = Donnee2;
Annee[count] = Donnee3;
Email [count] = Donnee4;
count ++;
}//Fin while
buff.close(); /** Fermeture du buffer */
System.out.println("Votre fichier a bien été pris en compte");
}//fin try
catch(IOException err) {
System.out.println("Erreur : " +err);
}//fin catch
}
/**
* Méthode de tri à bulles : modifie le tableau passé en paramètre pour classer tous ses éléments
* en ordre croissant et réalise les mêmes mouvements pour les autres données.
*
* @param tableau Le tableau contenant la donnée à trier en ordre croissant
*/
public static void TriCroissant(String tableau[]){
String tmpNom;
String tmpPrenom;
String tmpAnnee;
String tmpEmail;
for(int i=0;i<tableau.length;i++)
for(int j=0;j<Nom.length-1;j++)
{
if(tableau[j].compareTo(tableau[j+1])>0)
{
tmpNom=Nom[j+1];
Nom[j+1]=Nom[j];
Nom[j]=tmpNom;
tmpPrenom=Prenom[j+1];
Prenom[j+1]=Prenom[j];
Prenom[j]=tmpPrenom;
tmpAnnee=Annee[j+1];
Annee[j+1]=Annee[j];
Annee[j]=tmpAnnee;
tmpEmail=Email[j+1];
Email[j+1]=Email[j];
Email[j]=tmpEmail;
}
}
}
/**
* Méthode de tri à bulles : modifie le tableau passé en paramètre pour classer tous ses éléments
* en ordre décroissant et réalise les mêmes mouvements pour les autres données.
*
* @param tableau Le tableau contenant la donnée à trier en ordre décroissant
*/
public static void TriDecroissant(String tableau[]){
String tmpNom;
String tmpPrenom;
String tmpAnnee;
String tmpEmail;
for(int i=0;i<tableau.length;i++)
for(int j=0;j<Nom.length-1;j++)
{
if(tableau[j].compareTo(tableau[j+1])<0)
{
tmpNom=Nom[j+1];
Nom[j+1]=Nom[j];
Nom[j]=tmpNom;
tmpPrenom=Prenom[j+1];
Prenom[j+1]=Prenom[j];
Prenom[j]=tmpPrenom;
tmpAnnee=Annee[j+1];
Annee[j+1]=Annee[j];
Annee[j]=tmpAnnee;
tmpEmail=Email[j+1];
Email[j+1]=Email[j];
Email[j]=tmpEmail;
}
}
}
/**
* Méthode chargée de créer un fichier html avec les données de chaque
* tableau ordonnées en un seul tableau récapitulatif
*
* @throws IOException
*/
public static void creerHtml()throws IOException{
System.out.println("Les donnees ont bien ete triees.");
System.out.println("Elles vont maintenant etre sauvegardees dans un tableau html.");
System.out.println("Merci de bien vouloir specifier un nom pour ce fichier de sauvegarde (n'oubliez pas l'extension .html !) :");
Scanner in = new Scanner(System.in);
String FichierSortie = in.next();
FileWriter sortie = new FileWriter(FichierSortie);
BufferedWriter BW = new BufferedWriter(sortie);
BW.write("<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' '<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>'>" +"\r\n");
BW.write("<HTML xmlns='<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>' xml:lang='fr'>" +"\r\n");
BW.write("<HEAD>"+"\r\n");
BW.write("<TITLE>");
BW.write("TP4 - Manipulation de fichier texte, chaînes de caractères et tri");
BW.write("</TITLE>");
BW.write("</HEAD>"+"\r\n");
BW.write("<BODY>"+"\r\n");
BW.write("<TABLE BORDER>"+"\r\n");
BW.write("<TR>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write("Nom");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write("Prenom");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write("Annee");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write("E-mail");
BW.write("</TD>"+"\r\n");
BW.write("</TR>"+"\r\n");
BW.write("<TR>"+"\r\n");
/** Boucle permettant l'insertion des données contenues dans les tableaux */
for(int i=0;i<29;i++){
BW.write("<TD>"+"\r\n");
BW.write(Nom[i]+ "\r\n");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write(Prenom[i]+ "\r\n");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write(Annee[i]+ "\r\n");
BW.write("</TD>"+"\r\n");
BW.write("<TD>"+"\r\n");
BW.write(Email[i]+ "\r\n");
BW.write("</TD>"+"\r\n");
BW.write("</TR>"+"\r\n");
}
BW.write("<TABLE BORDER>"+"\r\n");
BW.write("</BODY>"+"\r\n");
BW.write("</HTML>"+"\r\n");
System.out.println();
System.out.println("Le fichier a ete enregistre dans le repertoire courant");
System.out.println("Vous pouvez des a present proceder a un nouveau tri");
System.out.println();
System.out.println();
BW.close();
}
public static void main(String[]args)throws IOException{
/** Demande d'entrée du nom de fichier à l'utilisateur */
Scanner clavier = new Scanner(System.in);
System.out.println("Saisir le nom du fichier de donnees (avec son extension .txt) : ");
String fil = clavier.next();
recDonnees(fil);
int Read0=0;
BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
while (Read0!=9)
{
System.out.println("Merci de bien vouloir spécifier le tri que vous souhaitez appliquer : ");
System.out.println("(1) Tri par nom croissant");
System.out.println("(2) Tri par nom decroissant");
System.out.println("(3) Tri par prenom croisant");
System.out.println("(4) Tri par prenom decroissant");
System.out.println("(5) Tri par annee croissant");
System.out.println("(6) Tri par annee decroissant");
System.out.println("(7) Tri par e-mail croissant");
System.out.println("(8) Tri par e-mail decroissant");
System.out.println("(9) --Fin--");
System.out.println("Votre choix : ");
String lireEntree0;
lireEntree0 = entree.readLine();
Read0=Integer.parseInt(lireEntree0);
switch(Read0)
{
case 1 :
{
TriCroissant(Nom);
creerHtml();
break;
}
case 2 :
{
TriDecroissant(Nom);
creerHtml();
break;
}
case 3 :
{
TriCroissant(Prenom);
creerHtml();
break;
}
case 4 :
{
TriDecroissant(Prenom);
creerHtml();
break;
}
case 5 :
{
TriCroissant(Annee);
creerHtml();
break;
}
case 6 :
{
TriDecroissant(Annee);
creerHtml();
break;
}
case 7 :
{
TriCroissant(Email);
creerHtml();
break;
}
case 8 :
{
TriDecroissant(Email);
creerHtml();
break;
}
default :
{
Read0=9;
System.out.println("Merci d'avoir utilise ce programme !");
break;
}
}
}
}
}
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.
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumLire un fichier txt avec java
- ForumCreer un fichier txt en java
- ForumLire un fichier txt en java
- ForumCreer fichier txt java
- ForumJava ecrire fichier txt
- ForumEcrire dans un fichier txt java
- ForumLire fichier txt en java
- ForumJava ecrire dans un fichier txt
- ForumÉcrire dans un fichier txt en java
- ForumCréer un fichier txt en java
- Voir plus