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 :

Parser un fichier un peu spécial.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Par défaut Parser un fichier un peu spécial.
    Bonjour,
    je suis occuper de créer un programme qui récupère quelques information dans les fichier de configuration de la plateforme steam, afin de faire un backup de données qui "disparaissent" de temps en temps ( serveurs de jeu en favoris par exemple, c'est assez gênant. )

    J'ai déjà commencer à développer pas mal de module, et j'en suis arriver à un point ou je bute totalement. Je dois parser des fichier ressemblant à ça :

    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
    "Filters"
    {
    	"gamelist"		"favorites"
    	"FilterList"
    	{
    		"InternetGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    			"location"		"0"
    		}
    		"FavoriteGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"HistoryGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"SpectateGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    			"location"		"0"
    		}
    		"LanGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"FriendsGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    	}
    	"Favorites"
    	{
    		"1"
    		{
    			"name"		"91.121.40.155:27019"
    			"address"		"91.121.40.155:27019"
    			"lastplayed"		"1235768428"
    			"appID"		"240"
    		}
    ....
    ....
    Je dois donc essayer de lire des information sur plusieurs niveau dans un jeu de nœud assez déroutant. J'ai donc penser à accéder à ces informations par "path", donc ce dire que pour accéder à "AppID" du nœud InternetGames du Nœud FIlterList du nœud Filters ( OUF ! ), je donner en paramètre à la fonction en paramètre : "Filters/FilterList/InternetGames/appID".

    Cependant j'ai énormément de mal à développer cette fonction, ça tourne dans tous les sens dans ma tête je vais devenir fou

    J'aimerai savoir si ce type de fichier de configuration fait partie d'une norme spécifique, et s'il existe déjà des classes pour le parser ? Sinon, si vous pouviez m'aider à en développez une, je suis conscient qu'il sera question de récursivité, et je suis déjà assez perdu sans ^^

    EDIT : Je developpe en C# sur le framework 2.0

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    et si tu transformerais ton fichier en fichier XML ca ne serait pas "plus" simple ?

    Tu pourrais lire ligne par ligne, et en fonction de ce que tu trouves à la ligne suivante (accolade ouvrante ou fermante) fermer ta balise XML...

    Avec un fichier XML, cela serait plus simple pour lire tes données (voir tu pourrais utiliser XSD pour générer la classe associée à ton fichier et donc avoir une "navigation" bien plus simple, aisée et rapide

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Je sais pas si transformer en xml est plus simple (faire correspondre les accolades, créer les nodes qui correspondent aux valeur, etc...)
    Mais le fichier à l'air "super basique" dans sa structure, une lecture ligne par ligne semble être la solution.
    A priori tu n'as que 3 types de lignes possibles :
    - Accolade ouvrante
    - Accolade fermante
    - Valeur du type "entrée" ou "entry" "valeur"

    Donc tu te crées une classe qui va contenir tes données :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Entrée
    {
       public List<Entrée> SousEntrées = new List<Entrée>();
     
       public string nom = "";
       public string valeur = "";
    }
    Et la lecture se fera dans un genre comme celui ci, avec une belle récursivité et où wr est un StreamReader :
    Code c# : 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
     
    public Entrée[] ReadSection(StreamReader wr)
    {
      string ligne = wr.ReadLine();
      List<Entrée> actuel = new List<Entrée>();
      line = supprimer les espaces blancs de line
      if(line == "{")
        actuel[actuel.Length - 1].SousEntrées.AddRange(ReadSection(wr));
      else if(line == "}")
        return actuel.ToArray();
      else
      {
        string[] parties = line.Split(" ",StringSplitOptions.RemoveEmptyBidule);
        Entrée nouvelle_entrée = new Entrée();
        nouvelle_entrée.nom = parties[0]; /* penser à retirer les " */
        nouvelle_entrée.valeur = parties[1];
        actuel.Add(nouvelle_entrée);
      }
    }
    J'ai pas testé, mais pour moi c'est ça l'idée.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Par défaut
    Bonsoir,
    merci pour vos réponse. Smyley j'ai repris ton code, un peut remis en forme, et un peu bidouiller, et je plombe : en gros aucune sous entrée se crée.

    Voilà mon code :

    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
            public VDFEntry[] ReadSection(StreamReader wr)
            {
                string line = wr.ReadLine();
     
                if (line != null)
                {
                    line = line.Trim(new char[] { ' ', '\t' });
                    if (line == "{")
                    {
                        actuel[actuel.Count - 1].SousEntrées.AddRange(ReadSection(wr));
                    }
                    else if (line == "}")
                    {
                        ReadSection(wr);
                    }
                    else if (line != "}")
                    {
                        string[] parties = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                        VDFEntry nouvelle_entrée = new VDFEntry();
                        nouvelle_entrée.nom = parties[0].Trim(new char[] { '\"' });
                        if (parties.Length > 1)
                            nouvelle_entrée.valeur = parties[1].Trim(new char[] { '\"' });
                        actuel.Add(nouvelle_entrée);
                        ReadSection(wr);
     
                    }
                }
                return actuel.ToArray();
            }
    Qu'ai-je fait pour que rien ne marche comme prévu ?

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    tu as fais des trucs bizarres

    Code c# : 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
     
    public class VDFEntry
            {
                public string nom = "";
                public string valeur = "";
                public List<VDFEntry> SousEntrées = new List<VDFEntry>();
            }
     
            public VDFEntry[] ReadSection(TextReader wr)
            {
                List<VDFEntry> actuel = new List<VDFEntry>();
     
                string line = wr.ReadLine();
     
                while (line != null)
                {
                    line = line.Trim(new char[] { ' ', '\t' });
                    if (line == "{")
                    {
                        actuel[actuel.Count - 1].SousEntrées.AddRange(ReadSection(wr));
                    }
                    else if (line == "}")
                    {
                        return actuel.ToArray();
                    }
                    else
                    {
                        string[] parties = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                        VDFEntry nouvelle_entrée = new VDFEntry();
                        nouvelle_entrée.nom = parties[0].Trim(new char[] { '\"' });
                        if (parties.Length > 1)
                            nouvelle_entrée.valeur = parties[1].Trim(new char[] { '\"' });
                        actuel.Add(nouvelle_entrée);
                        //ReadSection(wr);
     
                    }
     
                    line = wr.ReadLine();
                }
                return actuel.ToArray();
            }
     
            /* utilisation */
                string bidule = Properties.Resources.TextFile1;
                using (var fsx = new StringReader(bidule))
                {
                    VDFEntry[] res = ReadSection(fsx);
                    /* et là tout est dans res */
                }

    Pour TextFile1 j'ai mis ça et c'est ok :
    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
    "Filters"
    {
    	"gamelist"		"favorites"
    	"FilterList"
    	{
    		"InternetGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    			"location"		"0"
    		}
    		"FavoriteGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"HistoryGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"SpectateGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    			"location"		"0"
    		}
    		"LanGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    		"FriendsGames"
    		{
    			"appID"		"0"
    			"ping"		"0"
    			"NoFull"		"0"
    			"NoEmpty"		"0"
    			"NoPassword"		"0"
    			"Secure"		"0"
    		}
    	}
    	"Favorites"
    	{
    		"1"
    		{
    			"name"		"91.121.40.155:27019"
    			"address"		"91.121.40.155:27019"
    			"lastplayed"		"1235768428"
    			"appID"		"240"
    		}
        }
    }
    ps. Cette fois j'ai testé.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Par défaut
    Merci, je vais tester ça dès que je renterai chez moi ( je dépend de la SNCF ) !

    Et pour repérer un élément en particulier, je suppose que je vais devoir imbriqué des foreach

Discussions similaires

  1. Parser un fichier binaire à extension spéciale
    Par VulpesZerda dans le forum WebGL
    Réponses: 10
    Dernier message: 26/08/2014, 09h37
  2. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08
  3. ORDER BY un peu spécial
    Par gromez dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 29/04/2004, 11h17
  4. parser un fichier avec xerces
    Par traiangueul dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 02/02/2004, 18h14
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

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