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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Salut, j'ajoute a ce qu'a dit Chubyone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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;
    L'utilisation d'un stringbuilder est conseillee pour une concatenation de plus de 3 (ou 4 suivant les avis) strings.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Pour ce cas-là, String.Format serait le plus clair.

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/09/2014, 11h15
  2. Optimisation de code, génération de fichiers (.txt et .xls)
    Par shadypierre dans le forum VBA Access
    Réponses: 4
    Dernier message: 17/03/2010, 18h06
  3. Réponses: 2
    Dernier message: 08/11/2006, 20h57
  4. Réponses: 8
    Dernier message: 14/09/2006, 16h43
  5. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo