Optimisation de trie et filtre fichier ASCII

peyramay Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 22 juin 2010 - 24 janv. 2009 à 22:31
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 - 25 janv. 2009 à 21:24
Bonjour,

je suis en train de réaliser une application pour le boulot qui doit
trier et filtrer les doublons dans de nombreux fichiers de données en
ASCII.

Chaque fichier ASCII est délimté par des tabulations et la premiere ligne represente les entete des fichiers.

Le trie ainsi que le filtre sont réalisés sur champs donte le premier une date GPS est le plus significatif.

J'ai donc créér une classe trame ayant pour attributs les champs à
trier et une classe fichier représentant l'ensemble des trames du
fichier à trier et filtrer.

Mais vue le nombre de fichiers et le nombre de lignes à filtrer et trier ,je dois absolument optimiser le temps d'éxécution.


Voici mon code:

public void Creation(string pathOut)

        {


            string ligne="";


            string lastLigne = "";

            StreamReader sr=null;

            Trame tr;


            Stopwatch monSWtest1 = new Stopwatch();

            long temps = 0;


            //Lecture du fichier 

            try

            {

                sr = new StreamReader(g_pathFile + "\" + g_nameFile);


                //initiaisation du pointeur dans le fichier

                pointeurLineInFile = 0;


                //lecture 1er ligne entete contennant les labels

                firstLigne = sr.ReadLine();


                pointeurLineInFile++;

                string[] readText;

                switch (g_typeFichier)

                {

                    case TYPE_FICHIER.FICHIER_UNDEFINED:

                        break;

                    case TYPE_FICHIER.FICHIER_DATA_OP:

                        readText = File.ReadAllLines(g_pathFile + "\" + g_nameFile);

                        //this.AddRange(File.ReadAllLines(g_pathFile + "\" + g_nameFile) as Fichier);

                        //Compteur à 1 pour éviter les entetes de colonnes

                        for (int i = 1; i < readText.Length; i++)

                        {

                            ligne = readText[i];

                            if ((ligne != null) && (ligne != ""))

                            {

                                monSWtest1.Start();

                                tr = new Trame(ligne, g_typeFichier);

                                //Filtre et trie

                                if (true == AddTrame(tr))

                                monSWtest1.Stop();

                                //récupération du résulat

                                temps = monSWtest1.ElapsedMilliseconds;

                                monSWtest1.Reset();

                            }

                        }

                        this.SortListTrame();

                        break;

                    case TYPE_FICHIER.FICHIER_ISBA_INSTRUM:

                        //on lit la ligne

                        readText = File.ReadAllLines(g_pathFile + "\" + g_nameFile);

                        for (int i = 1; i < readText.Length; i++)

                        {

                            ligne = readText[i];

                            if ((ligne != null) && (ligne != ""))

                            {

                                monSWtest1.Start();

                                tr = new Trame(ligne, g_typeFichier);

                                //Filtre et trie

                                if (true == AddTrame(tr))

                                    monSWtest1.Stop();

                                //récupération du résulat

                                temps = monSWtest1.ElapsedMilliseconds;

                                monSWtest1.Reset();

                            }

                        }

                        lastLigne = readText[readText.Length - 1];

                        //Traitement de la minuterie si fichier instrumentation ISBA

                       TraitementMinuterie();

                        break;

                    case TYPE_FICHIER.FICHIER_PSB_SCI:

                        break;

                    case TYPE_FICHIER.FICHIER_KML:

                        break;

                    case TYPE_FICHIER.FICHIER_COMPRESS:

                        break;

                    default:

                        break;

                }               

            }

            catch (Exception maieuh)

            {  

                Console.WriteLine("Impossible de lire ce fichier : \n" + maieuh.Message);

                if (sr != null)

                {

                    sr.Close();

                }

            }


        }

private bool AddTrame(Trame tr)

        {

            bool bRet = false;

            //bRet = g_ficherATM.Contains(tr);

            bRet = this.Contains(tr);


            //si la data n'est pas en doublon (si le fichier ne le contient pas cette data)

            if (!bRet)

            {

                //on ajoute la trame au fichier

                this.Add(tr);

            }

            else

            {

                bRet = true;

            }


            return bRet;

        }


        public void SortListTrame()

        {

            //trie le fichier

            try

            {

                this.Sort();

            }

            catch (Exception maieuh)

            {

                Console.WriteLine("Impossible Trier ce fichier : \n" + maieuh.Message);

            }          

        }


D'avance merci

3 réponses

WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
25 janv. 2009 à 04:14
Salut,

Pourquoi ne lis-tu pas le fichier ligne par ligne, au lieu de tout lire et mettre les lignes mettre dans readText, puis après parcourir readText?

genre
case TYPE_FICHIER.FICHIER_ISBA_INSTRUM:
                      
                        //on lit la ligne
                       StreamReader sr = new StreamReader(g_pathFile + "\" + g_nameFile);
                       sr.ReadLine();//Saute la 1ere ligne
                      
                     string line;
                    while (!sr.EndOfStream)
                    {
                           line = sr.ReadLine();
                          if(!string.IsNullOrEmpty(line))
                         {
                            //... ajoute ta trame
                        }
                    }
0
peyramay Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 22 juin 2010
25 janv. 2009 à 14:50
Salut et merci pour ta réponse,
c'est vrai qu'il n'est pas nécéssaire de lire toutes les lignes.
cela vient du fait que je voulais tenter de remplir l'objet this qui représente une liste générique d'ojets trames à partir du tableau de lecture du fichiers mais sans succes.

this.AddRange(File.ReadAllLines(g_pathFile + "\" + g_nameFile) as Fichier);

Je pensais que pour optimser la lecture de ces fichiers j'aurais pu utiliser une méthode de sérialisation mais ces méthodes ne propose rien pour la lecture et l'écriture des fichiers ASCII j'ai donc essayer de le "sérialiser" en force.
Puis jouer sur l'overide des méthodes sort et contains de  la liste generique d'objets que j'ai crée à partir de la sérialisation.
D'ailleurs je ne sais pas trop comment m'y prendre pour surchager ces methodes et surtout si cela m'apportera un gain de vitess en éxécution.

D'avance merci
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
25 janv. 2009 à 21:24
Salut,

Juste un truc que j'ai remarqué. Est-ce que Trame est une classe ou une structure? Si c'est une classe, Contains retourne true si l'objet Trame que tu vas essayer d'ajouter est déjà présent dans la liste, c'est-à-dire la même référence.  Donc si tu testes Contains avec un nouvel objet Trame, même si l'objet à les même propriétés qu'un objet existant ça te retournera false.

this.Add(new Trame(ligne)); //ajoute une nouvelle Trame
bool ret this.Contains(new Trame(ligne));//ajoute une nouvelle Trame avec les même caractéristiques> ret est false

Si dans l'exemple précédent tu veux que Contains retourne true, tu peux utiliser la surcharge de Contains qui prend un IEqualityComparer. Mais ça n'éméliorera sans doute pas la vitesse, au contraire.

Pour trier tes trames, regarde les surcharges de Sort. Il y a une qui prend un ICOmparer en paramère, ce qui te permet de spécifier comment faire le tri.
0