IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Optimisation de code: lecture de fichier de trace


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Par d�faut Optimisation de code: lecture de fichier de trace
    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 :

    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();
                }
    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)
    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

  2. #2
    Membre �m�rite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par d�faut
    Il ne faut pas lire Ligne par Ligne.
    C'est a chaque fois un acc�s disc dur ce qui est extrement couteux en temps.

    Il faut charger dans un tampon le fichier : FileStream

    http://msdn2.microsoft.com/fr-fr/lib...h9(VS.80).aspx


    Le mieux ensuite serait de cr�er une collection de string de tes erreurs, et tout a la fin tu rempli ton gridview (comme ca au besoin tu garde ta collection pour la transporter ailleurs)
    Sinon tu ajoute ton gridview dynamiquement � la fin (tu le fais toi pas le designer), et ensuite tu ajoute ton event manuellement.

    Dans l'ordre:
    - affichage de ta form (sans le gridview)
    - affichage d'une seconde form (en top) qui indique que ca charge
    - chargement du fichier dans un tampon puis traitement : remplissage collection et/ou gridview
    - insertion du gridview dans la form
    - ajout de l'event au gridview

    Ensuite ya tjs des trucs a faire ici ou la

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Par d�faut
    Ok ok merci du tuyau,

    Je vais regarder � �a pour adapter et voir ce que ca donne.
    Ca peut prendre du temps comme j'aime comprendre ce que je fais et que mon niveau n'est pas tres haut.

    Donc merci encore et a bientot pour le r�sultat

  4. #4