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 :

Récupérer une partie du contenu d'un fichier et le mettre dans un autre [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 143
    Points : 43
    Points
    43
    Par défaut Récupérer une partie du contenu d'un fichier et le mettre dans un autre
    Bonjour,

    Je souhaite récupérer les classes d'un fichier .cs pour les mettre chacune dans un fichier à part.

    J'ai déjà vu comment lire/écrire dans un fichier mais j'arrive pas à savoir comment récupérer un bloc de "public class bidule {" à "}".

    Merci d'avances pour votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Tu peux utiliser les méthodes Split et Substring.

    Cependant tu auras un problème car tu retrouveras beaucoup de fois "}" dans ton code..

    A+

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 143
    Points : 43
    Points
    43
    Par défaut
    J'avais trouvé la fonction ReadBlock() mais comme tu le dit mon problème est que je sais pas comment définir la fin de la classe avec "}". Encore si c'était comme en VB avec le endclass sa aurait été plus simple ^^'

  4. #4
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 119
    Points : 202
    Points
    202
    Par défaut
    Bonjour,

    Pour définir la fin de ta classe une solution est de compter le nombre d'accolade ouvrante et fermente à partir du mots clé "class". Quand ils sont égaux ton bloc de classe est fini.

    Le mieux est de voir directement avec un bout de code. Tu peux créer un appli console C# et remplacer la fonction Main par le code ci-dessous pour tester. Tu as la logique du découpage en bloc de classe, je te laisse l'adapter et l'optimiser.

    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
    static void Main(string[] args)
            {
                string file = null;
                Console.WriteLine("Welcome in my app");
                file =  @"Chemin du fichier .cs";
                int nbAccoOuv = 0;
                int nbAccoFer = 0;
                bool inClass = false;
                List<string> LBlockClass = new List<string>();
                StringBuilder strBuilder = new StringBuilder();
                string currentLine = null;
                try
                {
                    StreamReader sr = new StreamReader(file);
                    while (sr.Peek() > -1)
                    {                   
                        currentLine = sr.ReadLine();
                        if (currentLine.Contains("class"))
                        {
                            inClass = true;
                        }
                        if (inClass)
                        {
                            strBuilder.AppendLine(currentLine);
                            nbAccoOuv = nbAccoOuv + currentLine.Count(x => x == '{');
                            nbAccoFer = nbAccoFer + currentLine.Count(x => x == '}');
                            if (nbAccoOuv == nbAccoFer && nbAccoOuv != 0 && nbAccoFer != 0)
                            {
                                string inter = strBuilder.ToString();
                                LBlockClass.Add(inter);
                                strBuilder.Clear();
                                inClass = false;
                                nbAccoOuv = 0;
                                nbAccoFer = 0;
                            }
                        }
                    }
                    foreach (var classFound in LBlockClass)
                    {
                        Console.WriteLine("Class block");
                        Console.WriteLine(classFound.ToString());
                        Console.WriteLine("/////////////////////////////////////////////");
                    }
     
                }
                catch (Exception ex)
                {
                    Console.WriteLine("test failed : {0}", ex.ToString());
                }
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }
    En espérant aider.

    Darkcrift

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 143
    Points : 43
    Points
    43
    Par défaut
    Salut

    Merci pour ton aide. J'ai testé ton code à part et j'ai rajouté la partie où l'on met tout dans un fichier et sa marche niquel.

    Par contre maintenant que je l'ai intégré dans mon code la sa coince ^^'

    Il reste bloqué sur le fait que le fichier existe déjà au début.
    J'ai du surement mal fait mon truc avec les conditions.
    Je continue quand même à essayer de régler le problème

    Je n'ajoute pas le code directement ici car sa ferait trop long.
    Donc voici le fichier :
    Program.cs

    Et le fichier de test sans mon propre code :
    Program.cs

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 119
    Points : 202
    Points
    202
    Par défaut
    bonjour,

    Tu peux ajouter ton code directement, ce n'est pas un problème. Si on veut on peut le visualiser dans une page à part, ça évite de télécharger un fichier potentiellement corrompu et/ou malveillant.

    Concernant le code je te conseille de faire du débogage pas à pas pour vraiment comprendre se qui se passe et ou ça bug. Je t'invite à aller voir ce tuto et ce tuto. Le débuggeur de Visual Studio est un outils très puissant, ça t'aidera vraiment dans tes développements.

    J'ai modifier un peut ton code, cette version devrait fonctionner :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
     
    namespace ExtractClass
    {
        class Program
        {
            struct maClasse
            {
                public string monNameSpace;
                public string monNomClasse;
                public string monTypeClasse;
                public string monCorpClass;
                public string monFichier;
            }
     
            // Récupère le nom de la classe avec son type (public ou private)
            // att : chaine --> ligne de lecture du fichier
            public static string recupNomClass(string chaine)
            {
                string theClassName = "";
                maClasse laClasse = new maClasse();
                try
                {
                    int index = chaine.IndexOf("class");
                    int index2 = chaine.IndexOf(':');
                    int indexPublic = chaine.IndexOf("public");
                    int indexPrivate = chaine.IndexOf("private");
                    // Si c'est privée par défaut
                    if (indexPublic < 0 && indexPrivate < 0)
                    {
                        laClasse.monTypeClasse = "private";
                        // Si il y a présence d'une classe héritée
                        if (index2 >= 0)
                        {
                            string[] bonneChaine = chaine.Split(':');
                            laClasse.monNomClasse = bonneChaine[0].Replace("class", "_").Trim();
                            //theClassName = laClasse.monTypeClasse + laClasse.monNomClasse;
                        }
                        else
                        {
                            laClasse.monNomClasse = chaine.Replace("class", "_").Trim();
                        }
                        theClassName = laClasse.monTypeClasse + laClasse.monNomClasse;
                    }
                    else
                    {
                        // Si il y a présence d'une classe héritée
                        if (index2 >= 0)
                        {
                            string[] bonneChaine = chaine.Split(':');
                            laClasse.monNomClasse = bonneChaine[0].Trim().Replace("class", "_").Trim();
                            theClassName = laClasse.monTypeClasse + laClasse.monNomClasse;
                        }
                        else
                        {
                            //char[] splitters = new char[] {' '};
                            string[] laCase = chaine.Split(' ');
     
                            laClasse.monTypeClasse = laCase[0].Trim();
                            laClasse.monNomClasse = chaine.Replace("class", "_").Trim();
                            theClassName = laClasse.monNomClasse;
                        }
                    }
                    theClassName = theClassName.Replace(" ", "");
                }
                catch (Exception e)
                {
                    Console.WriteLine("Classe introuvable :");
                    Console.WriteLine(e.Message);
                }
                return theClassName;
            }
     
            // Extrait les classes du fichier et les ajoutes dans des fichiers à part
            // att : file2 --> chemin plus nom du fichier à extraire
            //       path --> chemin où l'extraire
            public static void extraction(string file2, string path)
            {
                int nbAccoOuv = 0;
                int nbAccoFer = 0;
                bool inClass = false;
                List<maClasse> LBlockClass = new List<maClasse>();
                StringBuilder strBuilder = new StringBuilder();
                string currentLine = null;
                try
                {
                    using (StreamReader sr = new StreamReader(file2))
                    {
                        string nomFichier = "";
                        maClasse laClasse = new maClasse();
                        //parcours le fichier ligne par ligne
                        while (sr.Peek() > -1)
                        {
                            currentLine = sr.ReadLine();
                            if (currentLine.IndexOf("namespace") >= 0)
                            {
                                laClasse.monNameSpace = currentLine.Replace("namespace", "").Trim();
                            }
                            //si la ligne comport le mots clé "class" crée le nom et le chemin du fichier     
                            if (currentLine.Contains("class"))
                            {
                                inClass = true;
                                nomFichier = laClasse.monNameSpace + '_' + recupNomClass(currentLine) + ".cs";
                                laClasse.monFichier = System.IO.Path.Combine(path, nomFichier);
                            }
                            //si on est dans une classe on ajoute chaque ligne du fichier au stringBuilder
                            if (inClass)
                            {
                                strBuilder.AppendLine(currentLine);
                                nbAccoOuv = nbAccoOuv + currentLine.Count(x => x == '{');
                                nbAccoFer = nbAccoFer + currentLine.Count(x => x == '}');
                                //si on arrive à la fin de la classe on ajout la structure à la liste et on reset les variable pour le reste du fichier
                                if (nbAccoOuv == nbAccoFer && nbAccoOuv != 0 && nbAccoFer != 0)
                                {
                                    laClasse.monCorpClass = strBuilder.ToString();
                                    LBlockClass.Add(laClasse);
                                    strBuilder.Clear();
                                    inClass = false;
                                    nbAccoOuv = 0;
                                    nbAccoFer = 0;
                                }
                            }
                        }
                        // on parcours la liste de classe pour les insérer dans les nouveaux fichiers
                        foreach (var classFound in LBlockClass)
                        {
                            Console.WriteLine("Class block");
                            Console.WriteLine(classFound.monCorpClass.ToString());
                            Console.WriteLine("/////////////////////////////////////////////");
                            if (!System.IO.File.Exists(classFound.monFichier))
                            {
                                System.IO.StreamWriter fileDest2 = new System.IO.StreamWriter(classFound.monFichier);
                                fileDest2.WriteLine(classFound.monCorpClass.ToString());
                                fileDest2.Close();
                            }
                            else
                            {
                                Console.WriteLine("Le fichier \"{0}\" existe déjà.", nomFichier);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Le fichier ne peux être lu :");
                    Console.WriteLine(e.Message);
                }
            }
     
            static void Main(string[] args)
            {
                Console.WriteLine("Entrez le chemin avec le nom du fichier à extraire :");
                string fichier = Console.ReadLine();
     
                Console.WriteLine("Entrez le chemin où l'extraire :");
                string chemin = Console.ReadLine();
     
                extraction(fichier, chemin);
     
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }
        }
    }
    Cordialement,

    Darkcrift

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 143
    Points : 43
    Points
    43
    Par défaut
    Merci

    J'avais vu que le problème était que j'avais mis les 2 while du coup j'avais essayé d'en mettre juste un car les 2 faisait la même chose, mais d'autres problèmes sont venu par la suite ^^'

    J'avais essayé le débuggeur aussi mais avec la boucle j'arrivais jamais à la fin du script

    En tout cas merci pour ton aide encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2007] Récupérer une partie du contenu d'une liste
    Par ludojojo dans le forum SharePoint
    Réponses: 4
    Dernier message: 19/03/2010, 15h31
  2. Récupérer une partie d'un nom de fichier
    Par ben_harper dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 25/06/2008, 07h19
  3. Réponses: 4
    Dernier message: 27/09/2007, 15h05
  4. [VBA]Récupérer une partie du chemin d'un fichier
    Par poivre dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/04/2007, 19h34
  5. Réponses: 4
    Dernier message: 28/03/2006, 23h05

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