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

VB.NET Discussion :

Parcours de String (Parser?) [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut Parcours de String (Parser?)
    Bonjour,

    Voilà, actuellement, je m'efforce de créer une fonction qui servira à analyser le contenu d'une grosse TextBox.
    Celle-ci pourra contenir de très nombreuses combinaisons d'opérateurs et éléments à prendre en compte suivant l'opérateur (l'ajout de parenthèses pour donner une priorité sur les opérateur est également prévu).
    Son contenu doit être analyser pour créer une requête SQL dynamique en fonction des besoins.

    Pour cela, il me faut analyser chaque chose contenu dans cette TextBox.
    Après quelques recherches, j'ai trouvé pas mal de sujets sur la recherche d'occurence dans des chaînes de caractères, la fonction Mid, InStr, au détail près que dans mon cas, je ne vois pas très bien comment les implémenter.

    Exemple :
    - La présence d'un + fera prendre en compte le chaîne qui précède le prochaine opérateur dans un "And" de la clause "WHERE" de la requête.

    Enfin, avec de pouvoir finaliser ceci, il me faudrait trouver comment jeter un oeil sur chacun des caractère de la textbox (1 par 1). Un truc du genre ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each "" In Me.TB_CRITERE.Text
    Next
    On m'a mit sur la voie des compilateur, ce qui m'a fait trouver les Expréssions régulières, analyseurs lexicaux et synthaxiques, mais je vous avoue que pour mon niveau actuel, cela me parait extrêment flou.

    Peut-être que certains parmis pourraient m'orienter sur le sujet?
    Mon idée de passer chaque caractère en revue est-elle correcte?
    Ces éxpréssions régulière sont-elle vraiment si puissantes? Je veux dire, je pense pouvoir vérifier qu'il n'y a aucun caractère intru grâce à celles-ci, mais elles permettent également de vérifier des choses du genre, la présence d'un nombre pair de parenthèses? Que les opérateurs doivent être suivis d'une chaîne? Peut-être même préparer le chemin sur la gestion des priorités via les parenthèses?

    Merci d'avance, j'espère ne pas avoir été trop confus, si quelque chose vous paraît un peu trop abstrait, faites le moi savoir, je m'efforcerais d'éclaircir ma pensée

  2. #2
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    Bonjour,

    place a un peut de concret,
    peut tu nous donner la chaine que tu aura dans ta TextBox
    ainsi que la requête SQL que ça devra donner en sortie.

    merci

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Il est bien la le problèmes, la chaîne qui sera récupérée via la textbox n'est pas prédéterminée. Plus concrètement :
    "+ Pack" correspondrait à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim strRequete As String = ""
    'Code
    strRequete = strRequete & "AND nom_produit like %pack%
    "- Pack" correspondrait au contraire, l'absence de pack dans le nom_produit.

    Au final, il y à trois opérateur qui sont +, -, ou. Auquels sont ajoutés des parenthèses pour gérer les priorité

    Exemple:

    "+ Pack ou (+ machin - truc)"
    Cela signifierait :
    - Pour lesquels le nom du produit contient Pack, Ou bien que "machin" est présent et "truc" absent

    L'utilisateur pourra ajouter plusieurs critère de cette manière, la seule limite est celle des champ de la base de donnée qui est de 255 caractères.

    Ai-je répondu à la question?

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Re,
    Après quelques heures de recherche, je pense pouvoir détailler mon besoin.

    Pour faire simple, ce que j'ai besoin de faire est un analyseur grammaticale (Un Parser)
    De mon côté, tout ce que j'arrive à faire est un For Next parcourant chaque charactère dans lequel j'imbrique des dizaines de If..ElseIF..EndIf accomodés de quelques Booléens..Je pense que je suis bien loin du résultat escompté

    Personne n'a une idée de ce sur quoi je pourrait m'orienter? Peut-être un endroit qui détail la réalisation d'un Parser?

  5. #5
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    Bien définir sont besoin c'est bien mais il faut lâcher le stylo à un moment

    tant que tu ne donnera pas un exemple concret qui représente bien ton cas,
    nous ne pourrons pas saisir complétement ta problématique.

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'contenu de la TextBox
    a + b + c or c - d
     
    'et ça donne 
    '... *correspondance en SQL*
    Donc arrête d'écrire et donne nous 1 bon exemple

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Si c'est un exemple de code qu'il te faut, on risque d'être bien géné par le fait que mon problème est que justement je ne sait pas comment accomplir la tâche.

    Enfin, je vais essayer :


    Comme tu le dis, dans la texte box un utilisateur écrit quelque chose comme ça :
    (+ a + b + c) or (c - d) (Enfin, si tu préfère on peut le mettre nous même pour le principe

    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
    Me.TB_CRITERES.Text = (+ a + b + c) or (c - d)
     
    'Ensuite, il faut traiter le contenu de la TextBox (analyser son contenu pour y réagir suivant la demande de l'utilisateur)
    If "(" Then
        strRequete = strRequete & " ("
    ElseIf ")" 
        strRequete = strRequete & ") "
    End If
     
    If "+" Then
        strRequete = strRequete & "AND"
    ElseIf "-" Then
        strRequete = strRequete & "AND not" 'ou not in, je regarderais la syntaxe SQL après, ceci est un détail
    ElseIf "or" Then
        strRequete = strRequete & "Or"
    End If
    Je pense qu'il est clair que la génération de la clause where est dynamique, et par la même occasion plutôt difficile à prévoir.
    Cela est-il un bon exemple?

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 201
    Par défaut
    moi je pense avoir compris
    enfin pour en être sûr voilà ce que j'ai compris

    "+ Pack ou (+ machin - truc)"
    =>
    WHERE nom LIKE '%Pack%" OR (nom LIKE '%machin%' AND nom NOT LIKE '%truc%')


    si cela n'est pas prévu pour être plus compliqué, tu peux rester sur l'idée d'un parseur
    mais si tu veux rajouter d'autres instructions il faudrait utiliser autre chose, par exemple une création graphique, on glisse un plus et tu ajoutes à une collection un +, visuellement ca reste pareil, mais il n'y a pas à parser car tout est géré
    enfin tu peux aussi faire comme ca avec ton schéma actuel

    pour lire tous les caractères d'une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for each c as char in me.Textbox1.text
      select case c
        case "+"c
        case "-"c
        case " "c
        case else
    next
    mais ca reste très chiant à écrire
    si tu ne trouves ni + ni - ni espace, il faut concaténer pour obtenir le mot dans une variable, sachant que ca peut etre un "ou"
    les parenthèses, il ne suffit pas de les compter +) c'est pas bon par exemple
    il faut bien penser à tous les cas possibles et ca peut etre galère


    d'autre part si c'est pour inventer un langage à écrire, pourquoi ne pas utiliser la syntaxe sql directement ?

    les regex, c'est bien gentil, mais pas toujours simple à écrire

    l'option du compilateur n'en est pas une à mon avis


    bref un système graphique me semble le plus approprié, avec une collection des items posés, et des classes distinctes pour les types d'objet posables (+item -item oritem ()item valueitem)
    comme ca si on pose une ")" et que typeof previousitem is not valueitem then interdire, ca reste plus simple à coder, et à transformer en requête
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Merci beaucoup pour toutes ces précision Pol63, en effet je crois que tu as bien saisie mon problème. Ton interprétation SQL de mon exemple est exactement le but recherché
    L'idée du compileur, c'était juste une piste, certainement dans le but de m'orienter vers le Parser

    Inventer un langage à écrire? Je ne suis pas sûr de saisir l'idée, mais je pense pas que ce soit le cas, c'est juste pour pouvoir augmenter considérablement les possibilitées de gestion sur une partie de la base de donnée. De plus, ceci sera utiliser par des utilisateurs qui je pourrais qualifiés de "Lambda", n'ayant donc aucune base en développement, SQL, ou autre sujet lié à l'informatique.

    Pour les éventuels instructions à ajouter, tu pensais en quantitée ou en type? Car effectivement il peut y avoir un nombre indéfini de condition, mais seulement 3 opérateurs logique (parenthèses mis à part)


    En ce qui concerne la création graphique, je ne suis pas certains de comprendre, je mettrais en place une liste contenant les opérateurs, et par drag & drop, l'utilisateur pourra les mettre en place?
    Au niveau de la collection, elle aurait pour but de stoquer tous les éléments de la TextBox pour en faciliter le traitement?

    Enfin, si j'ai bien compris, dans la mesure ou je me maintiens à mes 3 opérateurs et mes parenthèses, le parser est une bonne option. Dans ce cas, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for each c as char in me.Textbox1.text
      select case c
        case "+"c
        case "-"c
        case " "c
        case else
    next
    est considéré comme un parser?

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 201
    Par défaut
    definition de parser : Algorithme qui permet d'analyser un texte et d'en déterminer sa structure syntaxique afin d'effectuer divers traitement

    donc oui un for each c as char et un select case c avec du code dedans peut etre considéré comme un parseur

    néanmoins je conseille encore une gestion graphique pour ca, avec un autre modèle par exemple (sans textbox ca ne sert à rien si on ne parse pas)
    en vertical les "or"
    en horizontal les "and"
    un bouton pour ajouter une condition qui contient un textbox

    voir la pièce jointe
    c'est encore plus simple pour l'utilisateur car il n'a pas à écrire en informaticien avec des - des + des ( et autres
    c'est un simple usercontrol avec un combobox (contient/ne contient pas/ou autre dans le futur) et un textbox ou il tape le mot recherché (ou non)
    et un bouton pour en poser un ou on veut

    ca reste évolutif, si tu veux filtrer sur un nombre, tu mets < = > ≠ etc dans le combobox
    si tu veux gérer une date, il faut un datetimepicker à la place du textbox


    niveau développement, rien à faire le usercontrol expose le texte du textbox, l'opérateur choisi, et tu parcours le conteneur pour les trouver ainsi que les or et les and



    et dans les 2 cas (interface ou parseur) il faut prévoir l'inverse du traitement, soit à partir de la requête reconstituer le paramétrage, soit à partir d'une sauvegarde sous un format plus simple
    Images attachées Images attachées  
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Merci infiniment pour toute l'aide que tu m'as apporté. Grâce à toi je pense pouvoir obtenir quelque chose de fonctionnel.

    A première vue je pars vers un Select Case, dont voilà mon 1er jet, très peu esthétique, encore moins optimisé :
    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
            For Each c As Char In Me.TB_CRITERES.Text
                Select Case c
                    Case "+"
                        strMotsCles = ""
                        strRequete = strRequete & " AND nom_produit LIKE %"
                    Case "-"
                        strMotsCles = ""
                        strRequete = strRequete & " AND nom_produit NOT LIKE %"
                    Case " "
                        If Not strMotsCles = "ou" Then
                            strRequete = strRequete & strMotsCles & "%"
                        Else
                            strRequete = strRequete & " Or"
                        End If
                        strMotsCles = ""
                    Case "("
                        strMotsCles = ""
                        strRequete = strRequete & " ("
                    Case ")"
                        strMotsCles = ""
                        strRequete = strRequete & ")"
                    Case Else
                        strMotsCles = strMotsCles & c
                End Select
            Next
    (Ceci n'est pas fonctionnel et encore moins testé, mais ça pourra toujours servir de base si un jour quelqu'un retombe sur ce sujet ^^)
    Il me reste à vérifier l'ensemble des possibiliter, gérer la saisie pour éviter les erreurs de synthaxe, et prendre en compte le or (ou un symbole quelconque correspondant)

    En ce qui concerne le passage dans le sens inverse, cela se fera par un récupération des critère dans la base de donnée (un champ est la pour cela). Je verrais bien les détails par la suite

    Ton orientation vers l'aspect graphique est également intéressante, mais moins évident de mon point de vue (qui est celui d'un débutant ). Je vais donc me contenter de ce Parser, ce qui me convient très bien et participera à me donner une base pour la suite de mes études?

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 201
    Par défaut
    Citation Envoyé par Maniz Voir le message
    Ton orientation vers l'aspect graphique est également intéressante, mais moins évident de mon point de vue (qui est celui d'un débutant ). Je vais donc me contenter de ce Parser, ce qui me convient très bien et participera à me donner une base pour la suite de mes études?

    il est vrai que le parseur ne demande que des bases d'algorithmie, que tu sembles avoir aux vues du code pondu
    alors que la méthode graphique demande beaucoup plus de choses (POO, usercontroles, layout des controles ...)


    nb : vérifier le cas de + machin ou + ouilleouilleouille (commencant par "ou")
    et est-ce possible que l'utilisateur veuille recherche un + ou un - ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Merci de ces précisions.

    Non, l'utilisateur ne cherchera pas de + ou de -, heuresement pour moi
    Et en ce qui concerne le "ou", il est géré au niveau du caractère espace, comme tous les autres mots donc tous les mots ayant ou comme préfixe "ou" ne seront pas pris en compte. Car ma variable tampon contiendra donc "Ouille" au moment de son traitement

    Pour les mots composés, soit je les interdirait, sois j'aviserais lorsque ma fonction sera fonctionnelle (Gros jeux de mot )

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

Discussions similaires

  1. [XML] [string] parser une string XML
    Par fxp17 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 29/03/2006, 10h27
  2. Réponses: 9
    Dernier message: 30/11/2005, 18h18
  3. Parser un String
    Par pittacos dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/10/2005, 13h26
  4. [DOM] Parser une string
    Par judi_kl dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 19/11/2004, 11h06
  5. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04

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