Hello,
J'essaie de ma mettre à Java, mais c'est pas si simple ...![]()
Je fais un programme qui va récupérer des informations dans un fichier texte et les met ensuite dans un fichier texte séparé par ";".
J'ai donc une classe FicSortie qui implémente un objet à partir du répertoire et du nom de ficher. Jusque là ça va. Maintenant j'ai plusieurs méthodes, et c'est là je pense que je fais pas ce qu'il faut ...
Pour résumer, mon fichier de test initial ne comprenait que 1100 lignes, donc le traitement était assez rapide. J'ai voulu le tester sur un fichier de 34000 ligneset là même après un café ça avait toujours pas finit !! Un script plus complexe en perl s'exécute en quelques secondes sur le même fichier
![]()
Bref, j'ai construit ma classe ainsi:
- constructeur : à partir du répertoire et du nom de fichier
- méthode contenu : lit le fichier ligne à ligne et renvoie un String où chaque ligne est séparée par un ";"
- méthode nbAnalyses : split le résultat de contenu() par ";", et compte le nombre d'occurences d'une chaine de texte ("IDENTIFICATION"), renvoie un Integer
- méthode listeAnalyses : split le résultat de contenu() par ";", et récupère les identifiants concernés, renvoie un Integer[] contenant les identifiants (qui sont donc des entiers)
- contenuAnalyse(identifiant) : split le résultat de contenu() par ";", recherche la partie concernant l'identifiant passé en argument, et renvoie un String[] avec les infos nécessaires
Au début à chaque appel de .contenu() il relisait le fichier texte, plutôt long, donc j'ai ajouté dans ma classe un booléen qui sert à savoir si le contenu a déjà été récupéré, et si c'est le cas alors contenu() le renvoie mais sans relire le fichier (un String le stocke dans la classe).
Néanmoins j'ai l'impression que j'emmêle les pinceaux dans la manipulation des objets, je pense stocker le résultat de .contenu().split(";") dans un String[], hors à chaque fois que j'utilise ledit String[] il fait appel à ma méthode contenu(), est-ce normal ?
Mon programme principal :
Et ma classe FicSortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static void main(String[] args) { FicSortie fichier = new FicSortie("C:\\MONCHEMIN\\","fichier.txt"); System.out.println("Nombre d'analyses : "+fichier.nbAnalyses()); System.out.println("Analyses n° 3 : "+fichier.listeAnalyses()[2]); }
Pour information ça me renvoie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 import java.io.BufferedReader; import java.io.FileReader; public class FicSortie { // Variables d'instance private String monChemin; private String monFichier; // Variables globales private Boolean dejaFait; // pour savoir si le fichier a déjà été récupéré private String contenuFichier; // contenu du fichier si déjà récupéré // Constructeur public FicSortie(String chemin, String fichier) { monChemin = chemin; monFichier = fichier; dejaFait = false; contenuFichier = null; } // les méthodes // renvoie le nombre d'analyses public Integer nbAnalyses (){ Integer comptage=0; // pour compter le nombre d'analyses, sert de retour String[] champsContenu=null; // tableau contenant les lignes de .contenu() splittées par ; champsContenu=contenu().split(";"); for (int cpt = 0; cpt < champsContenu.length ; cpt++){ if (champsContenu[cpt].equals("IDENTIFICATION")){ comptage++; } // fin du if } // fin de la boucle for return comptage; } // renvoie un Integer[] contenant les numéros d'analyses public Integer[] listeAnalyses () { String[] champsContenu=contenu().split(";"); // tableau contenant les lignes de .contenu() splittées par ; String listeConcateneAnalyses = null; Integer[] listeRetourAnalyses = new Integer[nbAnalyses()]; int cpt2 = 0 ; // intialisation du compteur pour le tableau d'entiers listeRetourAnalyses for (int cpt = 0; cpt < champsContenu.length ; cpt++){ if (champsContenu[cpt].equals("IDENTIFICATION")){ if (listeConcateneAnalyses == null){ listeRetourAnalyses[cpt2] = Integer.valueOf(champsContenu[cpt+1]); cpt2++; listeConcateneAnalyses = champsContenu[cpt+1]; } // fin du if else { listeRetourAnalyses[cpt2] = Integer.valueOf(champsContenu[cpt+1]); cpt2++; listeConcateneAnalyses = listeConcateneAnalyses+";"+champsContenu[cpt+1]; } // fin du else } // fin du if } // fin de la boucle for champsContenu = listeConcateneAnalyses.split(";"); return listeRetourAnalyses; } // renvoie le contenu du fichier private String contenu (){ BufferedReader lecture=null; if (dejaFait) { // TEST System.out.println("Fichier : déjà ouvert"); return contenuFichier; } else { try{ FileReader fichierAlire = new FileReader(monChemin + monFichier); // TEST System.out.println("1ère ouverture du fichier"); lecture = new BufferedReader(fichierAlire); } catch (Exception e){ Erreur(e,1); } } String ligne=null; // pour stocker le contenu de chaque ligne lue String ligneConcatene=null; // pour TEST try{ while((ligne=lecture.readLine())!=null){ if (ligneConcatene == null){ ligneConcatene = ligne; } // fin du if else { ligneConcatene = ligneConcatene+";"+ligne; } // fin du else } // fin du while } catch (Exception e){ Erreur(e,2); } // fin gestion erreur sur ouverture // fermeture fichier try{ lecture.close(); } catch (Exception e){ Erreur(e,3); } // fin gestion d'erreur sur fermeture //System.out.println("Fichier "+fichier+" fermé"); contenuFichier = ligneConcatene; // on stocke dans la variable globale le contenu du fichier dejaFait = true; // on met true pour dire que c'est déjà fait return ligneConcatene; } // Gestion des erreurs private static void Erreur(Exception e, int code){ System.err.println("Erreur : "+e); System.exit(code); } public static void main(String[] args) { } }
Donc, normalement dans ma méthode listeAnalyses(), la ligne String[] champsContenu=contenu().split(";"); fait appel à contenu() et stocke bien des éléments String dans le String[] champsContenu, donc les futures opérations sur champsContenu ne feront pas appel à contenu(), n'est-ce pas ?Ceci est un test
On va tester la lecture du fichier de sortie
On vient d'instancier l'objet FicSortie
1ère ouverture du fichier
Nombre d'analyses : 9
Fichier : déjà ouvert
Fichier : déjà ouvert
Analyse numéro 3 : 7400
C'EST FINI !!
Est-ce que je devrais pour contenu() plutôt que renvoyer une chaine texte séparée par des ";" renvoyer un String[] ?
Existe-il une méthode plus rapide pour lire un fichier texte de 34000 lignes ??
Usti
Partager