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

Langage Java Discussion :

Evaluation d'une expression logique contenu dans un String


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut Evaluation d'une expression logique contenu dans un String
    Bonjour tout le monde,

    Via une interface je permet à un utilisateur de créer une petite requête de filtrage de base de données au format txt. Rien de très poussé au niveau opérateur logique , juste des ET , OU et les paranthèses. Tout cela pour combiner plusieurs filtres sur les différents champs de la base.

    Comment dois je faire ensuite pour afficher seulement les lignes qui correspondent au filtre de l'utilisateur ??

    J'ai une méthode qui va me renvoyer true/false pour chaque partie du filtre.

    A partir de la je me retrouve avec un String, qui représente une expression logique ( et, ou , paranthèses, true, false) qu'il faut que j'evalue pour valider la ligne ou non.

    Comment puis je faire cela ??

    Merci.

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    le plus simple est peut être de faire exécuter la requete avec le filtre dans la clause WHERE non ? Toi tu veux trier une collection avec le filtre ? galère ...

    fait le faire par le bdd, c'est 100 fois plus simple

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par in
    fait le faire par le bdd, c'est 100 fois plus simple
    Je comprends pas bien ce que tu veux dire par la.
    Je travaille sur des fichier texte où les champs sont délimités par un caractère séparateur.

  4. #4
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Ce qu'il te dit c'est que tu n'as pas besoin de t'embeter a tester la faisabilite de la requete de l'utilisateur car si elle est fausse lors de son execution elle ne renverra pas de resultat.
    Si tu recuperes ton filtre tu n'as qu'a l'appliquer a ta requete comme dit "in" dans le where.
    Et en ce qui concerne tes separateurs tu les remplace par les bons separateurs de la requete.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Je me suis mal exprimé en fait.
    Quand j'ai mentionné une "requête" je ne faisais en aucun cas allusion au SQL. Je n'ai à disposition qu'un simple fichier texte que je dois filtrer en fonctions des besoins de l'utilisateur.

    Exemple : le fichier est de la forme suivante.

    Id#Email#Genre#Nom#Prenom#departement
    1#tt@tt.com#Masculin#Dupond#Mathieu#75
    ....
    ....


    L'utilisateur veut par exemple extraire les lignes du fichier correspondant "aux hommes qui habitent paris et toutes les femmes"

    via l'interface l'utilisateur va composer son filtre qui sera de la fome :

    ((Genre = masculin ET departement=paris) OU genre = féminin)

    Genre=masculin pour moi ça revient à verifier si la chaine de caractère du 3eme token d'une ligne du fichier correspond à "masculin" et en fonction de ça je renvoie true ou false.

    Donc pour chaque ligne du fichier je vais obtenir une expression logique du type ((false && true) || true)
    pour cette exemple l'evaluation de cette expréssion logique est VRAI donc la ligne correpond au filtre de l'utilisateur, donc je vais l'afficher. Et je fais ça pour chaque ligne.

    Mon problème c'est comment evaluer l'expression logique ??

    Si vous voyez également un autre moyen bien plus rapide de faire ça, je suis evidemment preneur ! Sachant que je n'ai aucune possibilité de conversion du fichier en un format différent ...

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    alors, c'est peut être pas ce que tu veux, mais je pense que le plus simple, et le moins lourd niveau traitement serait de charger le contenu de ce fichier dans une table et de l'interroger. Si tu peux le faire n'hésite pas.

    Sinon peut etre le convertir en XML et le parser en évaluant ton expression logique. Au niveau de l'évaluation de l'expression, c'est vrai que niveau conception c'est pas un truc forcément bateau .

    Sinon peut etre que tu peux transformer ton expression logique en un pattern pour une regexp ? sur ce point, je ne pense pas être du meilleur conseil

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    hélas charger le contenu dans une table, je ne peux pas ...
    Je faisais comme ça à la base, mais vu que je charge des fichiers de plusieurs millions de lignes avec enormement de champs par ligne , j'avais un depassement mémoire à chaque fois et j'etais vraiment tres loin d'etre arrivé au bout ! Je traite tout a partir du fichier maintenant , ligne par ligne.

    Convertir en XML tout le fichier, je ne peux pas non plus je pense. J'ai pas accès en écriture sur le serveur . De plus ce sont des fichiers qui pèsent minimum 800Mo

    L'idée du regexp était pas mal , mais le problème c'est que pour des champs tel que l'age ou une date , j'propose de pouvoir filtrer sur un intervalle : 18<age<25 par exemple. Donc j'pense pas pouvoir appliquer ça .

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par spip68
    hélas charger le contenu dans une table, je ne peux pas ...
    Je faisais comme ça à la base, mais vu que je charge des fichiers de plusieurs millions de lignes avec enormement de champs par ligne , j'avais un depassement mémoire à chaque fois et j'etais vraiment tres loin d'etre arrivé au bout ! Je traite tout a partir du fichier maintenant , ligne par ligne.
    c'est peut etre que tu le faisais pas de la bonne manière. Je ne sais pas quel type de bdd tu as. Mais si tu utilise Oracle, tu as SQLLDR dont c'est le boulot. Avec ça pas de pb de mémoire et en plus il fait ça super vite.

    Citation Envoyé par spip68
    L'idée du regexp était pas mal , mais le problème c'est que pour des champs tel que l'age ou une date , j'propose de pouvoir filtrer sur un intervalle : 18<age<25 par exemple. Donc j'pense pas pouvoir appliquer ça .
    effectivement

  9. #9
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Effectivement tu peux faire ceci dans un regexp mais moi non plus je ne suis pas un grand connaisseur dans ce domaine. Sinon tu fais une serie de fonction qui font des tests sur chaque element a filtrer. Mais ca risque d'etre long et pas tres optimise, sauf si tu te debrouilles bien vu que tu fais une analyse sur chaque ligne je pense que ca ira assez vite.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par in
    c'est peut etre que tu le faisais pas de la bonne manière. Je ne sais pas quel type de bdd tu as. Mais si tu utilise Oracle, tu as SQLLDR dont c'est le boulot. Avec ça pas de pb de mémoire et en plus il fait ça super vite.
    Je n'ai pas de base de données. J'ai un fichier *.txt contenant des données.

    en gros ce que je cherche à faire au niveau du résultat c'est un

    SELECT * FROM monFichier WHERE "les filtres de l'utilisateur"

    mais sans avoir accès au langage SQL bien entendu

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par fumiste972
    Effectivement tu peux faire ceci dans un regexp mais moi non plus je ne suis pas un grand connaisseur dans ce domaine. Sinon tu fais une serie de fonction qui font des tests sur chaque element a filtrer. Mais ca risque d'etre long et pas tres optimise, sauf si tu te debrouilles bien vu que tu fais une analyse sur chaque ligne je pense que ca ira assez vite.
    J'ai fait la méthode qui me permet de tester chaque élement à filtrer.
    cette méthode me renverra true/false
    Je "remplace" le retour de la méthode dans le filtre global et donc au final j'obtiens une expression logique de la forme : true && false par exemple dans un String ! maintenant il faudrait une méthode qui manipule ce String pour avoir en retour le booléen correspondant à l'evaluation de ce String , en l'occurence ici false !

  12. #12
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Tu as donc fais le plus difficile. Je ne comprend pas ton pb. c'est la fonction qui va traiter cette derniere chaine que tu n'arrives pas a faire c ca ?

  13. #13
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par spip68
    hélas charger le contenu dans une table, je ne peux pas ...
    Je faisais comme ça à la base

    Citation Envoyé par spip68
    Je n'ai pas de base de données.
    ben je comprends pas. Si tu avais une bdd avant ? ou est le pb de la reprendre ? surtout si c'est du oracle, avec SQLLDR, ton pb est réglé dans ce cas.

    bref.

    mais bon, ça va etre dur d'avoir un truc rapide ...

    Euh si je puis me permettre, quel est l'intérêt d'une telle manip ? pourquoi tes utilisateurs n'utilisent pas une bdd ou même un fichier Excel ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par fumiste972
    Tu as donc fais le plus difficile. Je ne comprend pas ton pb. c'est la fonction qui va traiter cette derniere chaine que tu n'arrives pas a faire c ca ?
    Exactement !

    l'utilisateur veut par exemple filtrer :

    genre=masculin && departement=75

    je vais savoir traiter toutes les sous parties !
    Mais ensuite je ne sais aps comment faire pour evaluer le filtre dans sa totalité

    sur l'exemple ci dessus , si dans le fichier j'en suis à la ligne suivante :
    mathieu#dupond#masculin#25ans#78

    je vais être capable de dire que :
    genre = masculin --> true
    departement = 75 --> false

    Maintenant comment je fais pour evaluer la totalité ??
    genre=masculin && departement=75 c'est à dire tout simplement true && false ?

  15. #15
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Si c'est pour traiter l'expression logique que tu as a la fin que tu bloques tu peux t'aider des exemples sur les programmes de calculatrice faits en java.
    C'est exactement le meme principe pour toi. A la difference que tu n'a pas des chiffres mais des true et false et tes operateurs sont soit des && ou des ||.
    Je te conseil donc de trouver des sources d'une calculatrice basique et de tout modifier.
    Mais comme j'ai di avant ca ne va pas etre tres rapide. C'est vraiment dommage que tu n'ai pas acces a une vraie bdd.
    Je ne sais pas si ca t'avance de bcp

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par in
    ben je comprends pas. Si tu avais une bdd avant ? ou est le pb de la reprendre ? surtout si c'est du oracle, avec SQLLDR, ton pb est réglé dans ce cas.

    bref.

    mais bon, ça va etre dur d'avoir un truc rapide ...

    Euh si je puis me permettre, quel est l'intérêt d'une telle manip ? pourquoi tes utilisateurs n'utilisent pas une bdd ou même un fichier Excel ?

    Non je n'ai jamais eu de bdd. Je n'ai acces qu'au fichier texte.
    Un fichier excel est limité à 65536 lignes , et je dois gérer des millions de lignes , d'ou le format txt.
    Mais de toute façon , le format ne dépend pas de moi, l'entreprise nous loue les fichiers sur ce format.
    L'utilisateur en fait ce serait moi. Enfin l'entreprise ou je suis. Le format ne dépend hélas pas de nous. Sinon c'est sur qu'avec une abse de données traditionnel ça aurait été parfait !

  17. #17
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Bon ben tu n'as donc pas le choix que l'idee de la calculette.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    ouais j'viens de regarder un peu. L'analyse syntaxique de la chaine de caractère semble être une bonne solution. good idea
    Je mets le sujet en [résolu] .
    Merci

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

Discussions similaires

  1. Sujet : Java - calculer une formule arithmétique contenue dans un "String"
    Par uchimizu dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/02/2008, 13h38
  2. [Oracle 9i] Evaluation d'une expression
    Par Process Linux dans le forum Oracle
    Réponses: 2
    Dernier message: 21/03/2006, 12h55
  3. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25
  4. Réponses: 10
    Dernier message: 18/11/2004, 23h12
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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