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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 200
    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 200
    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

+ 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