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 des données


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Parser des données
    Bonjour,

    Quelqu'un aurait-il une idée pour parser un texte de la forme ci-dessous ?
    nom1-Paramètre1;Parmètre2||nom2-Paramètre1;Paramètre2 etc...
    Juste le nom de la fonction C# à utiliser au pire, quelque chose qui me ferait avancer. C'est mon début dans ce langage et je dois dire que je galère énormément... Un peu d'aide des pro pour un débutant comme moi serait très sympatoch .

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 26
    Points : 20
    Points
    20
    Par défaut Début de réponse
    string szChaine = "nom1-Paramètre1;Parmètre2||nom2-Paramètre1;Paramètre2"

    string []szTab = szChaine.split("||")

    après tu boucles sur le tableau

    for(int i = 0; i<szTab.lenght;i++)
    {
    ... tu peux faire un split sur le ; pr tes param
    }

  3. #3
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    C'est du découpage de chaine de caractères, la faq en parle.
    Selon ce que tu veux faire, tu peux utiliser l'objet Regexp qui utilise les expressions régulières, et/ou les méthodes de l'objet String comme split, substring, ....
    Je te laisse chercher un peu, mais tu verras vite qu'en C# c'est très facile de faire ce genre de chose
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Ok c'est parfait, merci
    Désolé si la soluce étais dans la faq, je penserais à regarder la prochaine fois.

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    1) kinola, s'il te plait utilise les balises de code pour le code (dans l'éditeur de texte c'est le nouton #)
    2) Si c'est pour parcourir un tableau, une liste, ou autre chose d'énumérable, du début à la fin, c'est tellement mieux, et plus pratique d'utiliser un foreach
    3) dans la boucle, avant de splitter sur les ; le mieux est de faire un substring pour le nom en recherchant la premiere occurence de - pour connaître la longueur du nom.
    4) après le deuxieme split tu parcours de nouveau ton tableau par un foreach si tu en as besoin.
    5) syntaxe du foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string[] tabelt = "nom1-Paramètre1;Parmètre2||nom2-Paramètre1;Paramètre2".Split("||".ToCharArray());
    foreach (string elt in tabelt)
    {
    }
    6)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string []szTab = szChaine.split("||")
    Faux Split ne prend que des char ou des char[] comme séparateur. Mais tu peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string []szTab = szChaine.split("||".ToCharArray());
    7) tu oublis un peu tes points virgule.

    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  6. #6
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    si y a 10mo de parametres, ce n'est pas un peu lourd le split ?

  7. #7
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Si cela peut t'aider dans ton choix
    Personellement j'ai eu à faire ça il y a quelques semaines
    j'ai développé 3 solutions: 1) Split, search et autres fonctions de String
    2) expression régulière, 3) lecture caractère par caractère avec parcourt d'un diagrame d'état.

    au final
    1) code court, lisible et maintenable, vitesse d'execution 8 fois supérieurs à la solutions 3)
    2) Code court, moyennement lisible et maintenable, vitesse d'execution 30 fois supérieurs à la solution 3)
    3) Code important, difficile à lire (beaucoup d'imbrication), difficile à maintenir (même si j'ai mis pas mal de commentaires). Temps d'exécution le meilleur.

    Pour info, comme j'était en TDD, j'ai écrit une trentaine de tests, incluant tous les cas d'erreurs auxquelles j'ai pu penser. Et les 3 solutions les ont passé

    [edit]fautes de frappes et orth

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    bah après c'est à voir, la on parle de découpage de string de façon général et on ne s'était pas posé la question du volume de donnée.
    BigNic apporte des informations intéressante.
    Supposons que ces données soit dans un fichier texte et sur plusieurs ligne. Dans ce cas il est possible de parcourir le fichier ligne par ligne, et de traiter chaque ligne.
    Moins de données à mettre dans le buffer
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par BigNic Voir le message
    au final
    1) vitesse d'execution 8 fois supérieurs à la solutions 3)
    2) vitesse d'execution 30 fois supérieurs à la solution 3)
    3) Temps d'exécution le meilleur.
    Euh... pour toi un meillleur temps d'exécution ça veut dire un plus court ou un plus long ?
    Franckintosh, penseur différent.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Bein le plus court : puisque les autres sont tous supérieurs

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    puisque les autres sont tous supérieurs
    C'est l'inverse qui est marqué.
    Donc du coup on ne sait pas quelle est la solution qui s'exécute le plus rapidement.
    Franckintosh, penseur différent.

  12. #12
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    Bein le plus court : puisque les autres sont tous supérieurs
    Certes, mais il est écrit "vitesse x fois supérieure", ce qui signifie que la troisième solution serait la moins efficace, ce qui est contradictoire avec l'affirmation "Temps d'exécution le meilleur".

    Cela dit, je pense que la solution 3 est la plus rapide. Même si j'aurais une préférence pour la beauté de la solution 2.
    Par contre la solution 1 implique beaucoup trop de tests de sécurité et de garde-fou pour être acceptable à mon gout.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Right c'est vrai qu'il y a ambiguité : "vitesse supérieure" ou "temps supérieur" ?

    Arf grilled...

    bon je rajoute un truc à propos du Split :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string[] ki = "bouu.ouuuuuuuuuu.ouuuuuuuuuuuu".Split( '.' );
    foreach( string str in ki )
    {
        Console.WriteLine( str );
    }
    Pas besoin de "ToCharArray" : "x" = string ; 'x' = char

  14. #14
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    C'est vrai que c'était pas clair ce que j'ai dit, méa culpa.
    1) temps d'exécution assez important
    2) temps d'éxécution très important
    3) temps d'exécution le plus faible

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    Pas besoin de "ToCharArray" : "x" = string ; 'x' = char
    Mais 'xx' = erreur
    Si on veut un séparateur composé de plusieurs caractères il faut utiliser un tableau de caractères.

    Il faudrait soit lire moins vite soit changer ton parseur de lecture parce qu'apparement il oublie les mots clés important .
    Franckintosh, penseur différent.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Citation Envoyé par Franckintosh Voir le message
    Il faudrait soit lire moins vite soit changer ton parseur de lecture parce qu'apparement il oublie les mots clés important .
    nan... C'est mon Serializer de pensées généreuse qui as oublié quelques infos^^

  17. #17
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut


    C'est juste de la constatation après "gueulage" du compilo qui m'a fait prendre conscience que split n'acceptait pas les "%*£,;.:!" et après lecture de la bulle d'aide sur la fonction split (grâce à l'intelisence) j'ai compris qu'il voulait bien par contre les tableaux de charactère.
    D'où mon ToCharArray() .

    2) Code court, moyennement lisible et maintenable, vitesse d'execution 30 fois supérieurs à la solution 3)
    2) temps d'éxécution très important
    Ha pour une fois que quelqu'un m'apporte une preuve qu'il vaux mieux utiliser les méthodes de string plutôt que les expressions régulière je suis content

    Mais bon pour avoir une analyse parfaite, il faudrait voir cela en fonction de la taille de la chaine de caractères.
    Les expressions régulières restent elle plus lente que les méthodes de string pour les super grosse chaine de caractères ?
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  18. #18
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    encore quelques petite précisions la chaines pour mes tests faisais environ 250 charactères pour un peu plus d'une quinzaine de paramètres à deserialiser.
    Eune autere précision je ne suis pas un pro des regExps. Si la mienne fonctionnais correctement, il y avait certainement moyen de la rendre plus performante

  19. #19
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Ha pour une fois que quelqu'un m'apporte une preuve qu'il vaux mieux utiliser les méthodes de string plutôt que les expressions régulière je suis content
    Il ne faut pas être aussi catégorique, toute solution est une combinaison de plusieurs choses dont les principales sont la lisibilité, la maintenabilité et la performance. En fonction de la situation, on préfèrera une solution ou une autre, mais je n'ai jamais entendu dire que l'une était meilleure que l'autre dans tous les cas.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  20. #20
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    ...je n'ai jamais entendu dire que l'une était meilleure que l'autre dans tous les cas.
    Tu as de la chance, moi ça m'arrive 50 fois par jour.
    Mais effectivement dans l'absolu c'est faux de dire cela. Selon le contexte la bonne solution d'hier n'est pas la bonne d'aujourd'hui.

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

Discussions similaires

  1. [SAX] Parser un fichier XML et exraire des données dans un matrice ou liste en JAVA
    Par chcheibani dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 21/03/2014, 15h26
  2. Réponses: 0
    Dernier message: 05/11/2009, 18h12
  3. Réponses: 1
    Dernier message: 28/09/2005, 15h35
  4. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15
  5. Réponses: 2
    Dernier message: 18/12/2002, 10h30

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