none
Visual C# Urgent Optimisation Tri de fichier ASCII RRS feed

  • Question

  • 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 = readTextIdea;
                                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 = readTextIdea;
                                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

    samedi 24 janvier 2009 21:18

Réponses

  • Bonjour,

    Le plus simple est d'utiliser l'objet DataTable
    Vous créez vos colonnes, vous ajoutez vos lignes et vous manipulez celui-ci.
    Vous pouvez ainsi bénéficier des fonctionnalités de tri et de filtrage.

    Cordialement
    Gilles TOURREAU - MVP C#
    lundi 18 mai 2009 09:29
    Modérateur

Toutes les réponses

  • Bonjour,

    Question rapidité essaie avec LINQ. Il me semble que tu peux traiter un fichier ASCII et faire un tri.

    Lis toutes les données de ton fichier, mets les dans une LIST (enumerable ou ILIST) et ensuite fais ta querry avec LINQ .Distinct.

    :-)

    dimanche 25 janvier 2009 02:46
  • Salut et merci pour ta réponse,
    j'ai lu un peu sur LINQ et je t'en remercie car ça à l'air vraiment interresant.
    Mais j'ai aussi pu lire que cet outil fonctionnait sous le framework 3.0.
    Actuellement je travaille sur le framework 2.0 avec visual studio 2005.
    Puis-je passer au framework 3.0 seulement en le télechargeant?
    Mes développement et Visual Studio 2005 seront-ils affecté et dans quel mesure par ce changement?
    Quelle conséquences cela aurait-il sur le déploiement car je dois livré dans tres peu de temps?
     
    Enfin si tu as un petit exemple de l'utilisation de cet outil, j'ai vue que c'etait tres similaire a du SQL, pour ça pas de problème je me charge de la QUERY.

    D'avance Merci
    lundi 26 janvier 2009 22:17
  • Bonjour,

    Je pense qu'il n'y a pas de pb à passer de DotNet 2.0 à DotNet 3.5 !!!

    Tes codes en VS 2005 devraient fonctionner comme avant. Mais renseigne toi quand même avant

    sur le net au cas ou je dis des bêtises.

    A mon avis tu n'as rien à craindre, vas-y, fonce.

     

    Par contre si tu as LINQ dans ton code il faudra que la ou les machines sur lesquelles tu vas executer ton code

    disposent du DotNet 3.5 aussi !!! donc verifie que tu pourras faire l'upgrade des machines au cas où.

     

    Le code est cent fois plus simple que du SQL (que je ne connait pas et que je ne veux pas connaître). Voici un exemple

    de l'un de mes projets:

     

    var toutAmsterdam = from ams in fichierExcelAmsterdam.AsEnumerable()

    where ams.IsNull(fichierExcelAmsterdam.Columns[1]) == false // filtre les isins non nuls

    && ams.IsNull(fichierExcelAmsterdam.Columns[7]) == false // + filtre les prix last non nuls

    && ams.IsNull(fichierExcelAmsterdam.Columns[10]) == false // + filtre les dates

    && ams.Field<DateTime>(fichierExcelAmsterdam.Columns[10]).Year == DateTime.Now.Year // + filtre les dates

    select new

    {

    amsName = ams.Field<string>(fichierExcelAmsterdam.Columns[0]),

    amsIsin = ams.Field<string>(fichierExcelAmsterdam.Columns[1]),

    amsMarket = ams.Field<string>(fichierExcelAmsterdam.Columns[3]),

    amsTicker = ams.Field<string>(fichierExcelAmsterdam.Columns[4]),

    amsSector = ams.Field<string>(fichierExcelAmsterdam.Columns[5]),

    amsCurrency = ams.Field<string>(fichierExcelAmsterdam.ColumnsDevil),

    };

    var Amsterdam = from ttAms in toutAmsterdam.ToList().Distinct()

    select new

    {

    name = ttAms.amsName,

    isin = ttAms.amsIsin,

    mkt = ttAms.amsMarket,

    ticker = ttAms.amsTicker,

    sector = ttAms.amsSector,

    cncy = ttAms.amsCurrency,

    };

    dataGridView1.DataSource = Amsterdam.ToList();

     

     

    Ce code remplit un datagridview à partir d'un fichier excel...

    :-)

    mardi 27 janvier 2009 15:51
  • Bonjour,

    Le plus simple est d'utiliser l'objet DataTable
    Vous créez vos colonnes, vous ajoutez vos lignes et vous manipulez celui-ci.
    Vous pouvez ainsi bénéficier des fonctionnalités de tri et de filtrage.

    Cordialement
    Gilles TOURREAU - MVP C#
    lundi 18 mai 2009 09:29
    Modérateur