Bonjour tout le monde,
baby developpeur en C# (meme pas junior) j'ai fait une application qui permet de lire des traces stockées dans un fichier texte.
Les traces ont pour la plupart la forme suivante :
Info1£Info2£info3£... jusque 9
Chaque message de trace cntient les 9 champs.
Pour celà j'utilise un streamreader, je lis la ligne et la "split" en fonction du séparateur.
Pas trop de soucis jusqu'à ce que j'ai des traces d'erreur du genre :
Error£20070207112845500£IHM£frmMain.Main£User£Computer£Erreur dans MAIN : Erreur DB Source : Outil Stack : Ã* Outil.Trt_Erreur.Trt_SqlErreur(SqlException e, SqlTransaction myTransaction, Int32& retryHarder) dans D:\Mes Documents\Application\Outil\Trt_Erreur.cs:ligne 36
Ã* System.Windows.Forms.Control.OnClick(EventArgs e)
Ã* System.Windows.Forms.Button.OnClick(EventArgs e)
Ã* System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
... (et ca continue comme ca pendant plusieurs lignes comme vous pouvez vous en douter).
Le problème avec ces messages c'est que chaque "Ã System. .... " constitue une ligne à part entière et donc quand je lis la ligne avec le streamreader, il ne prend pas toute la trace mais une partie de la trace, puis chaque ligne d'erreur puis finalement la fin de la trace.
Donc dans mon exemple j'aurai :
1 ligne avec Error£20070207112845500 ... jusque ligne 36. Cette ligne sera splittée en 7
Puis 1 ligne pour chaque "Ã System. .... " qui elle ne sera pas splittée car le séparateur n'est pas présent
puis finalement une ligne pour la fin de la trace qui elle contient 3 autres champs.
Ceci, je l'ai résolu par un switch/case sur le nombre de partie trouvées.
Jusque là ca fonctionne. Le problème c'est que ca prend souvent longtemps pour charger de gros fichiers de trace.
voici le code que j'utilise pour lire le fichier et charger le datagrid :
en plus de cela j'ai un event qui regarde le "selection change" du datagrid et qui affiche le contenu d'une des colonne dans une textbox (ce qui permet de visualiser le message à porprement parler)
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 try { // StreamReader pour la lecture du fichier StreamReader SR = new StreamReader(fichier); string Ligne = SR.ReadLine(); string[] LigneSeparee; // Lecture de toutes les lignes while (Ligne != null) { LigneSeparee = Ligne.Split(new char[] { '£' }); switch (LigneSeparee.Length) { // cas normal case 9: { string date = LigneSeparee[1].ToString(); date = date.Substring(0, 4) + "/" + date.Substring(4, 2) + "/" + date.Substring(6, 2) + " " + date.Substring(8, 2) + ":" + date.Substring(10, 2) + ":" + date.Substring(12, 2) + " " + date.Substring(14); LigneSeparee[1] = date; object[] Donnees = new object[10]; Donnees[0] = NomDuFichier; for (int i = 1; i < Donnees.Length; i++) { Donnees[i] = LigneSeparee[i - 1]; } Messages.Tables[0].Rows.Add(Donnees); } break; // si pas cas normal alors il faut prendre la trace en plusieur fois case 7: { string date = LigneSeparee[1].ToString(); date = date.Substring(0, 4) + "/" + date.Substring(4, 2) + "/" + date.Substring(6, 2) + " " + date.Substring(8, 2) + ":" + date.Substring(10, 2) + ":" + date.Substring(12, 2) + " " + date.Substring(14); LigneSeparee[1] = date; DonneesTemporaires = new object[10]; DonneesTemporaires[0] = NomDuFichier; for (int i = 1; i < 8; i++) { DonneesTemporaires[i] = LigneSeparee[i - 1]; } } break; case 1: { string SuiteErreur = LigneSeparee[0]; string Erreur = DonneesTemporaires[7].ToString() + "\n " + SuiteErreur; DonneesTemporaires[7] = Erreur; } break; case 3: { string SuiteErreur = LigneSeparee[0]; string Erreur = DonneesTemporaires[7].ToString() + "\\n" + SuiteErreur; DonneesTemporaires[7] = Erreur; DonneesTemporaires[8] = LigneSeparee[1]; DonneesTemporaires[9] = LigneSeparee[2]; Messages.Tables[0].Rows.Add(DonneesTemporaires); } break; } Ligne = SR.ReadLine(); } SR.Close(); }
J'initialise l'event sur l'événement OnLoad de le la forme.
quelqu'un peut me dire comment optimiser le code ?
Merci d'avance
Partager