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 :

Sérialiser un document non balisé


Sujet :

C#

  1. #1
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut Sérialiser un document non balisé
    Bonjour à tous,

    Je suis devant un cas de figure assez anodin, je dois sérialiser un export qui n'est pas structuré mais qui a une logique redondante.

    Voilà un petit extrait (les commentaires sont de moi ):

    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
     
    03/04/2023 //Date de l'exposition
    Exposition du grand classique // Nom de l'exposition
    243 // Numéro de rue
    Rue de LAMBREYAGE // Nom de la rue
    59450 // Code postal
    Sin-le-Noble // Nom de la ville
    Art Contemporain // Catégorie de l'exposition
    Matthieu dethé // Nom de l'artiste
    45 // Age de l'artiste
    France // Lieu de naissance
    23 // Œuvres exposées
    Benoit Breton
    34
    France
    12
    Jean Flou
    65
    Belgique
    53
    Street Art 
    Nombre 
    3 // Nombre d'exposant
    Sabart Deco // Catégorie de l'exposition
    32
    France
    14 
    Laure Pez
    23
    Suisse
    4
    Nombre
    2
    Total
    5 // Nombre d'exposant Total
    Ces données ne sont pas réelles mais le principe du fichier est malheureusement bien celui là...

    Comme vous pouvez le constater il y a un schéma redondant dans les données.
    Mais je ne vois pas comment créer un modèle de sérialisation, sachant qu'en plus le nombre d'artiste par catégorie peut varier

    Comment dois-je sérialiser ça sachant que j'ai déjà créé la class suivante :

    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
    public class Exposition
    {
        public DateTime DateDebut { get; set; }
        public string NomExposition { get; set; }
        public int NumRue { get; set; }
        public string NomRue { get; set; }
        public int CodePostale { get; set; }
        public string NomVille { get; set; }
        public List<Categorie> Categories { get; set; }
     
        public class Categorie
        {
            public string Nom { get; set; }
            public List<Artiste> Artistes { get; set; }
        }
     
        public class Artiste
        {
            public string Nom { get; set; }
            public int Age { get; set; }
            public string Pays{ get; set; }
            public int Oeuvre { get; set; }
        }
    Merci pour votre aide.
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Le truc c'est que tu n'a rien qui t'indique quelle est la données, il faut donc trouver un autre moyen pour faire ce lien.

    Les 7 premières lignes semblent être uniques, tu dois donc pouvoir te baser sur leurs positions.
    Et à priori la 7 est une catégorie.
    Pour le reste, tu as une suite chaine (nom), nombre (âge), chaine (pays), nombre (œuvres), donc une chaine puis un nombre (2 fois)
    Et dès lors qu'on commence une nouvelle catégorie, il y a deux chaines à la suite.

    C'est assez tiré par les cheveux et j'ignore si ça suffira mais tu peut déjà essayer de te baser sur ces critères

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    Il y a des incohérences dans ton exemple au niveau des type d'exposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    03/04/2023 //Date de l'exposition
    Exposition du grand classique // Nom de l'exposition
    243 // Numéro de rue
    Rue de LAMBREYAGE // Nom de la rue
    59450 // Code postal
    Sin-le-Noble // Nom de la ville
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Art Contemporain // Catégorie de l'exposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Matthieu dethé // Nom de l'artiste
    45 // Age de l'artiste
    France // Lieu de naissance
    23 // Œuvres exposées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Benoit Breton
    34
    France
    12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Jean Flou
    65
    Belgique
    53
    jusque là tout vas bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Street Art //<== ligne en trop ?
    Nombre 
    3 // Nombre d'exposant
    ici on ne connait pas la liste des exposant Street Art? ou la ligne "Street Art" est en trop? ou ????

    Ensuite on retrouve une structure de type artiste ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sabart Deco // Catégorie de l'exposition 
    32
    France
    14
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Laure Pez
    23
    Suisse
    4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Total
    5 // Nombre d'exposant Total
    Donc pour moi on peut lire le bloc du début, ensuite, je parcourrai depuis la fin ou/et chercherai les mots clés Total et Nombre

  4. #4
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par umfred Voir le message
    Il y a des incohérences dans ton exemple au niveau des type d'exposition
    Tu as raison !
    Come je l'ai dit ce n'est pas le fichier original, c'était une création de tête.
    J'ai inversé :

    Street Art //<== ligne en trop ?
    Nombre
    3 // Nombre d'exposant
    Cela aurait du être :

    Nombre
    3 // Nombre d'exposant
    Street Art //Catégorie de l'expo.
    Le fichier au propre :

    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
    03/04/2023
    Exposition du grand classique
    243
    Rue de LAMBREYAGE
    59450
    Sin-le-Noble
    Liste des participants
    Art Contemporain
    Matthieu dethé
    45
    France
    23
    Benoit Breton
    34
    France
    12
    Jean Flou
    65
    Belgique
    53
    Nombre 
    3
    Street Art
    Sabart Deco
    32
    France
    14 
    Laure Pez
    23
    Suisse
    4
    Nombre
    2
    Nombre Total d'exposant
    5
    Ce qui entraine le changement de la class :

    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
     
    public class Exposition
    {
        public DateTime DateDebut { get; set; }
        public string NomExposition { get; set; }
        public int NumRue { get; set; }
        public string NomRue { get; set; }
        public int CodePostale { get; set; }
        public string NomVille { get; set; }
        public List<Exposant> Exposants { get; set; }
     
    	public class Exposant
        {
            public string Nom { get; set; }
            public List<Categorie> Categories { get; set; }
        }
     
        public class Categorie
        {
            public string Nom { get; set; }
            public List<Artiste> Artistes { get; set; }
        }
     
        public class Artiste
        {
            public string Nom { get; set; }
            public int Age { get; set; }
            public string Pays{ get; set; }
            public int Oeuvre { get; set; }
        }
    }
    Mais depuis mon message j'ai avancé :

    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
    using (StreamReader reader = new StreamReader("Fichier.txt"))
    {
        Exposition exposition = new Exposition();
        exposition.DateDebut = DateTime.Parse(reader.ReadLine());
        exposition.NomExposition = reader.ReadLine();
        exposition.NumRue = int.Parse(reader.ReadLine());
        exposition.NomRue = reader.ReadLine();
        exposition.CodePostale = int.Parse(reader.ReadLine());
        exposition.NomVille = reader.ReadLine();
        reader.ReadLine(); // Ignorer "Liste des participants"
     
        // Lecture des Exposants
        exposition.Exposants = new List<Exposant>();
        string nomExposant = reader.ReadLine();
        while (nomExposant != "Nombre Total d'exposant")
        {
            // Lecture des Catégories
            Exposant exposant = new Exposant();
            exposant.Nom = nomExposant;
            exposant.Categories = new List<Categorie>();
            string nomCategorie = reader.ReadLine();
            while (nomCategorie != "Nombre")
            {
                // Lecture des Artistes
                Categorie categorie = new Categorie();
                categorie.Nom = nomCategorie;
                categorie.Artistes = new List<Artiste>();
                string nomArtiste = reader.ReadLine();
                while (nomArtiste != "Nombre")
                {
                    Artiste artiste = new Artiste();
                    artiste.Nom = nomArtiste;
                    artiste.Age = int.Parse(reader.ReadLine());
                    artiste.Pays = reader.ReadLine();
                    artiste.Oeuvre = int.Parse(reader.ReadLine());
                    categorie.Artistes.Add(artiste);
                    nomArtiste = reader.ReadLine();
                }
                exposant.Categories.Add(categorie);
                nomCategorie = reader.ReadLine();
            }
            exposition.Exposants.Add(exposant);
            nomExposant = reader.ReadLine();
        }
     
        // Serialisation de l'objet Exposition dans un fichier JSON
        string json = JsonConvert.SerializeObject(exposition);
        File.WriteAllText("exposition.json", json);
    }
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  5. #5
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Je vais devenir Chèvre.

    Car l'export ne gère pas les 0.
    Si je reprends mon exemple
    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
    03/04/2023
    Exposition du grand classique
    243
    Rue de LAMBREYAGE
    59450
    Sin-le-Noble
    Liste des participants
    Art Contemporain
    Matthieu dethé
    45
    France
    23
    18  // Je rajoute ici
    Benoit Breton
    34
    France
    12
    5 // ici
    Jean Flou
    65
    Belgique
    53
    Nombre 
    3
    2 // ici
    Street Art
    Sabart Deco
    32
    France
    14
    7 // ici
    Laurent Pez
    23
    Suisse
    4 // Mais pas là
    Nombre
    2
    Nombre Total d'exposant
    5
    On pourrait expliquer ceci par un rubrique qui concerne le nombre d'œuvre à vendre.
    Le dernier exposant ne vendrait aucune de ses œuvres exposés (encore un excentrique)

    Et là ma méthode de lecture prends un coup dans le PIF. (Si je tenais le type qui m'a pondu un export aussi foireux que ça...)

    Si vous avez une idée sur comment ne pas se pendre devant ce genre de problème je suis preneur.

    Merci pour votre aide
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    ça fait un champ en plus par rapport au début du coup.
    la seule façon (qui me vient) c'est de tester si tu lis un entier quand tu arrives sur cette ligne, si oui, alors tu as ta valeurs, sinon, passer à la zone suivante

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour la culture personelle, pourquoi voulez-vous "sérialiser" un fichier ?

    Pour moi "sérialiser", c'est stocker sous forme de fichier (plus ou moins lisible) un objet.

    Du moment que vous avez déjà un fichier contenant tous les éléments de votre objet, je ne pige pas à quoi ça peut vous servir de le charger pour le réenregistrer en JSON... Mise à par si vous voulez "convertir" le fichier en entrée ?

    Car là, à la base, votre objet est déjà sérialisé... en fait... Quel intérêt de le désérialiser pour le resérialiser différemment ?
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Il n'est nulle part question de JSON.
    La question est d'arriver à lire correctement les informations du fichier malgré son format bancal.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    c'est vrai que ça s'appellerait plutôt du parsing (si le mot existe) ou de la désérialisation.

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Citation Envoyé par umfred Voir le message
    c'est vrai que ça s'appellerait plutôt du parsing (si le mot existe) ou de la désérialisation.
    Le mot existe "parsing" mais, justement ça n'en est pas.
    Le parsing implique des expressions terminales (des éléments de syntaxe communément appelée "jeton" et des expressions non terminales
    Les terminale du JSON par exemple, sonr les accolades, les crochets, les virgules, les deux points ou encore les double quotes) .
    Ici, il n'y a aucun élément terminale puisqu'on doit se baser sur le type et/ou la positions des éléments trouvés.

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Pour moi ici on fait de la désérialisation.

    Sinon, ma réaction à propos de le resérialisation est à cause des lignes 46 à 48 dans la première réponse de umfred :
    https://www.developpez.net/forums/d2.../#post11917796
    Code csharp : 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
    using (StreamReader reader = new StreamReader("Fichier.txt"))
    {
        Exposition exposition = new Exposition();
        exposition.DateDebut = DateTime.Parse(reader.ReadLine());
        exposition.NomExposition = reader.ReadLine();
        exposition.NumRue = int.Parse(reader.ReadLine());
        exposition.NomRue = reader.ReadLine();
        exposition.CodePostale = int.Parse(reader.ReadLine());
        exposition.NomVille = reader.ReadLine();
        reader.ReadLine(); // Ignorer "Liste des participants"
     
        // Lecture des Exposants
        exposition.Exposants = new List<Exposant>();
        string nomExposant = reader.ReadLine();
        while (nomExposant != "Nombre Total d'exposant")
        {
            // Lecture des Catégories
            Exposant exposant = new Exposant();
            exposant.Nom = nomExposant;
            exposant.Categories = new List<Categorie>();
            string nomCategorie = reader.ReadLine();
            while (nomCategorie != "Nombre")
            {
                // Lecture des Artistes
                Categorie categorie = new Categorie();
                categorie.Nom = nomCategorie;
                categorie.Artistes = new List<Artiste>();
                string nomArtiste = reader.ReadLine();
                while (nomArtiste != "Nombre")
                {
                    Artiste artiste = new Artiste();
                    artiste.Nom = nomArtiste;
                    artiste.Age = int.Parse(reader.ReadLine());
                    artiste.Pays = reader.ReadLine();
                    artiste.Oeuvre = int.Parse(reader.ReadLine());
                    categorie.Artistes.Add(artiste);
                    nomArtiste = reader.ReadLine();
                }
                exposant.Categories.Add(categorie);
                nomCategorie = reader.ReadLine();
            }
            exposition.Exposants.Add(exposant);
            nomExposant = reader.ReadLine();
        }
     
        // Serialisation de l'objet Exposition dans un fichier JSON
        string json = JsonConvert.SerializeObject(exposition);
        File.WriteAllText("exposition.json", json);
    }

    Je vois pas à quoi ça sert de charger le fichier pour le convertir ensuite en JSON... Ou alors la question est "comment convertir en JSON" mon machin.

    -- Edit : Ah, je crois que j'ai compris. C'est juste pour savoir si on a tout bien lu le fichier
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Bonjour,

    Pour la culture personnelle, pourquoi voulez-vous "sérialiser" un fichier ?
    Je tente de donnée une suite logique à un fichier qui en possède une mais qui n'est pas respectée.
    Pour pouvoir ensuite utiliser les informations contenu a travers un objet.


    Citation Envoyé par umfred
    ça fait un champ en plus par rapport au début du coup.
    la seule façon (qui me vient) c'est de tester si tu lis un entier quand tu arrives sur cette ligne, si oui, alors tu as ta valeurs, sinon, passer à la zone suivante
    J'ai tenté cette solution mais cela me décale a chaque itération :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ((ligne = sr.ReadLine()) != "Nombre"){
    ....
      string ligne = sr.ReadLine();
      while (Int32.TryParse(ligne, out number))
      {
        sr.ReadLine();
      }
    ....
    }
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Avec une approche un peu plus objet, voici comment je lis le fichier : (.NET 7.0)
    Code csharp : 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
    const string INPUT = @"03/04/2023
    Exposition du grand classique
    243
    Rue de LAMBREYAGE
    59450
    Sin-le-Noble
    Liste des participants
    Art Contemporain
    Matthieu dethé
    45
    France
    23
    18  // Je rajoute ici
    Benoit Breton
    34
    France
    12
    5 // ici
    Jean Flou
    65
    Belgique
    53
    Nombre 
    3
    2 // ici
    Street Art
    Sabart Deco
    32
    France
    14
    7 // ici
    Laurent Pez
    23
    Suisse
    4 // Mais pas là
    Nombre
    2
    Nombre Total d'exposant
    5";
     
    Console.WriteLine("Hello, World!");
    Exposition exposition = Exposition.Deserialize(INPUT);
    Console.WriteLine(exposition.Name);
    Console.WriteLine(exposition.Place.Street);
    Console.WriteLine(exposition.Categories.Count);
    foreach (Exposition.Category c in exposition.Categories)
    {
        Console.WriteLine(c.Name);
        foreach (Exposition.Participant p in c.Participants)
        {
            Console.WriteLine(p.Name);
        }
    }
     
    class Exposition
    {
        public DateOnly Date { get; set; }
        public string Name { get; set; } = string.Empty;
        public Address Place { get; set; } = new();
        public List<Category> Categories { get; set; } = new();
     
        public static Exposition Deserialize(string data)
        {
            // Nettoyage des données entrée
            string[] lines = data.Split("\r\n");
            for (int i = 0, cpt = lines.Length; i < cpt; i++)
            {
                if (lines[i].IndexOf("//") > 0)
                {
                    lines[i] = lines[i][..lines[i].IndexOf("//")];
                }
                lines[i] = lines[i].TrimEnd();
            }
     
            Exposition exposition = new()
            {
                Date = DateOnly.ParseExact(lines[0], "dd/MM/yyyy", null),
                Name = lines[1],
            };
     
            // Lecture de l'adresse
            exposition.Place = Address.Deserialize(lines[2..6]);
     
            if (lines[6] != "Liste des participants")
            {
                throw new FormatException("Le fichier ne semble pas convenir !");
            }
     
            int j = 7;
            while (lines[j] != "Nombre Total d'exposant")
            {
                (Category category, int readlines) = Category.Deserialize(lines[j..]);
                exposition.Categories.Add(category);
                j += readlines;
            }
     
            return exposition;
        }
     
        public class Address
        {
            public string Number { get; set; } = string.Empty;
            public string Street { get; set; } = string.Empty;
            public string PostalCode { get; set; } = string.Empty;
            public string City { get; set; } = string.Empty;
     
            public static Address Deserialize(string[] lines)
            {
                return new()
                {
                    Number = lines[0],
                    Street = lines[1],
                    PostalCode = lines[2],
                    City = lines[3],
                };
            }
        }
     
        public class Category
        {
            public string Name { get; set; } = string.Empty;
            public List<Participant> Participants { get; set; } = new();
     
            public static (Category, int) Deserialize(string[] lines)
            {
                Category category = new() { Name = lines[0] };
                int i = 1;
                while (lines[i] != "Nombre")
                {
                    (Participant participant, int readlines) = Participant.Deserialize(lines[i..(i + 5)]);
                    category.Participants.Add(participant);
                    i += readlines;
                }
                bool thirdLine = int.TryParse(lines[i + 2], out _);
                return (category, i + (thirdLine ? 3 : 2));
            }
        }
     
        public class Participant
        {
            public string Name { get; set; } = string.Empty;
            public int Age { get; set; }
            public string Country { get; set; } = string.Empty;
            public int WorkCount { get; set; }
            public int SellingCount { get; set; }
     
            public static (Participant, int) Deserialize(string[] lines)
            {
                bool fifthLine = int.TryParse(lines[4], out int sell);
                return (new() { Name = lines[0], Age = int.Parse(lines[1]), Country = lines[2], WorkCount = int.Parse(lines[3]), SellingCount = sell }, fifthLine ? 5 : 4);
            }
        }
    }
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    Citation Envoyé par llaffont Voir le message
    J
    J'ai tenté cette solution mais cela me décale a chaque itération :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ((ligne = sr.ReadLine()) != "Nombre"){
    ....
      string ligne = sr.ReadLine();
      while (Int32.TryParse(ligne, out number))
      {
        sr.ReadLine();
      }
    ....
    }
    Quand je parlais de zone suivante, c'est champ suivant (ça peut être soit "Nombre" soit un autre artiste.

  15. #15
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Avec une approche un peu plus objet, voici comment je lis le fichier : (.NET 7.0)
    [...]
    J'achète !

    ça fonctionne super bien. Je vais regarder comment le transposé à mon cas réel.

    Merci !
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  16. #16
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut Désérialiser un document mal structuré
    C'était trop beau pour être vrai.

    StringBuilder tu as fais du super boulot.
    Mais malheureusement mon véritable fichier est beaucoup plus mal structuré que mon exemple.

    Si je reprends ma transposition (Je suis désolé je ne peux soumettre la véritable source pour des raisons de confidentialité) :

    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
    03/04/2023
    Désérialisation un grand classique
    243
    Rue de LAMBREYAGE
    59450
    Sin-le-Noble
    Liste des Artiste
    Art Contemporain
    Emplacement
    Nom
    Age
    Pays
    Goodies
    Expos
    Sell
    1
    Matthieu dethé
    45
    France
    23
    18
    2
    Benoit Breton
    34
    France
    12
    5
    3
    Jean Flou
    65
    Belgique
    53
    Nombre
    3
    Street Art
    Emplacement
    Nom
    Age
    Pays
    Goodies
    Expos
    Sell
    1
    Sabart Deco
    32
    France
    140
    7
    2
    Laurent Pez
    23
    Suisse
    4
    Nombre
    2
    Art Grotesque
    Emplacement
    Nom
    Age
    Pays
    Goodies
    Expos
    Sell
    1
    Grouchy Deco
    32
    France
    9999
    71
    4
    2
    Masset Pez
    23
    Suisse
    4
    Nombre
    2
    Nombre Total d'exposant
    7"
    A priori j'ai la même structure que présenté précédemment, à la différence que la liste des exposants est précédée par l'intitulé des valeurs.

    ça n'est pas compliqué à remédier avec un regex dans la class Category :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (!Regex.IsMatch(lines[i], "^(Nom||Age||Pays||Goodies||Expos||Sell)$"))
                    { 
                    (Participant participant, int readlines) = Participant.Deserialize(lines[i..(i + 5)]);
                    category.Participants.Add(participant);
                    i += readlines;
                    }
                    else
                    {
                        i++;
                    }
    Mais là où cela devient tordu, c'est sur les valeurs en rouge.
    Elles représentent dans le logiciel la valeur des goodies, et l'on peut constater que certain en expose et d'autre pas.
    Ce qui rends inexploitable l'export.

    Je suis encore une fois preneur de propositionS...
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  17. #17
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression que tu es face un un problème insoluble.

    Si je comprends bien, ton fichier constitué de plusieurs éléments comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Emplacement = Nombre
    Nom = String
    Age = Nombre
    Pays = String
    Goodies = Nombre facultatif
    Expos = Nombre
    Sell = Nombre facultatif
    Donc entre le pays d'un élément et le nom de l'élément suivant, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Goodies = Nombre facultatif
    Expos = Nombre
    Sell = Nombre facultatif
    Emplacement = Nombre
    Soit 2 à 4 nombres.

    Etant donné que l'emplacement est obligatoire on a une série de 1 à 3 nombres à la suite.

    S'il n'y a qu'un seul nombre facile : c'est "Expos".
    En revanche, s'il y en a deux, ça peut tout à fait être "Goodies" et "Expos" ou "Expos" et "Sell".
    Il faudrait une règle.
    J'imagine que "Sell" est un sous-ensemble de "Expos". Donc si le second nombre est plus grand que le premier, alors le premier est "Goodies" et le second "Expos", puisque "Sell" ne peut pas être plus grand que "Expos".
    Mais si on a l'inverse, est-on sûr que "Goodies" est aussi plus petit que "Expos" ? Si oui, je tour es jouer, sinon, problème insoluble.

    Si Expos > Goodies et Expos > Sell alors :
    => Goodies = 1 / Expos = 2 / Sell = 1

    => Goodies = 0 / Expos = 2 / Sell = 1

    => Goodies = 1 / Expos = 2 / Sell = 0

    => Goodies = 0 / Expos = 2 / Sell = 0

    A toi de nous dire si c'est suffisant pour t'en sortir.

    -- Edit : ah, et il reste un point noir, même avec la règle...

    Ah, et j'oubliais d'autres cas problématiques...

    Emplacement est forcément un nombre ? Cas peut jamais être "1bis" ou autre "Salle Violette" ?
    Les artistes... J'espère qu'aucun ne porte un nom numérique, genre "20100"... (Vincent ah ah ah)
    On ne jouit bien que de ce qu’on partage.

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    Si tu n'as pas de valeur 0 pour ces champs, comment savoir à quel champ correspond la valeur que tu récupères ????? tu vas grave galérer sauf si il y a une règle tacite.

    Ceux qui te transmettent le fichier ne donnent pas de règles de composition de ce fichier ?

  19. #19
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Il me semble aussi que la solution n'est pas de mon côté.
    Mais en attendant on m'a laissé le droits de n'exploiter qu'une partie des données pour la seconde l'éditeur devra faire quelque chose.
    Pour y parvenir, je suis partie de ton idée StringBuilder et heureusement dans mes valeurs pour chaque "exposant" j'ai une chaine de caractère unique et formée selon un schéma spécifique.
    Ce qui me permet de me positionné avec un REGEX et de m'assurer que les valeurs qui précèdent et qui suivent sont bien de type attendu.

    Mais sans vous je n'y serais pas parvenu.
    Merci pour votre aide.

    La gueule de mon REGEX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /^([0-9]+)\r?\n(([A-Z]+[ ][A-Z]+)|([A-Z]+[ ][A-Z]+-[A-Z]+))\r?\n([A-Z]+([-| |][A-Z]+)?)\r?\n([0-9]{6}[A-Z]{1})\r?\n([A-Z][0-4][A-Z]{3})\r?\n([0-9]+)\r?\n([0-9]+)/gm
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

  20. #20
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par umfred Voir le message
    Si tu n'as pas de valeur 0 pour ces champs, comment savoir à quel champ correspond la valeur que tu récupères ????? tu vas grave galérer sauf si il y a une règle tacite.

    Ceux qui te transmettent le fichier ne donnent pas de règles de composition de ce fichier ?

    Ils sont plutôt pas très coopératif...

    Pour eux leur solution fonctionne, mais il faut remplir l'ensemble des champs avec une valeur positive. Ce qui devrait être majoritairement le cas sauf pour l'évènement à venir.
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !


    Albert Einstein

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/12/2008, 12h00
  2. Document Non Enregistré
    Par rickgoz dans le forum Excel
    Réponses: 19
    Dernier message: 09/11/2008, 14h24
  3. Réponses: 2
    Dernier message: 16/06/2007, 16h59
  4. Document non enregistré
    Par domimog dans le forum Excel
    Réponses: 4
    Dernier message: 29/05/2007, 07h46
  5. [DOM] Sérialiser un Document avec le DOCTYPE.
    Par Vignot dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 16/08/2005, 09h35

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