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

Macro Discussion :

Fonctions de quoting : str, nrquote, nbrquote


Sujet :

Macro

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut Fonctions de quoting : str, nrquote, nbrquote
    Bonjour,

    J'ai lu pas mal d'article par rapport aux fonctions de quoting.
    Mais rien n'y fait, je ne trouve pas toujours cela facile à comprendre.
    (quoting pour certains char, quoting pour la compilation, pour l'exécution,....)

    Donc voici la chaîne qui me pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %let msg_text = Problème d%str(%')intégrité [Guarantee -> Client (1,1) XOR Guarantee --> Auth/Guar (1,n)] : Les références ont été placées dans la table &dsname. (&nbobs observations).;
    Cela fonctionne en mettant %str.
    Par contre je n'arrive pas à comprendre la logique.
    Comment je peux savoir si je dois utiliser un %str, un %nrquote, un %bquote ou encore d'autres fonctions de quoting.

    De ce que j'ai lu, des char utilisés dans mon exemple, les ( ) , ' peuvent poser des problèmes.

    Ici, vraisemblablement, je n'ai besoin que de protéger mon apostrophe et pas les (), . Je comprends pas pourquoi.

    En bref:
    Comment savoir quelle fonction utiliser?
    'existe-t-il pas une fonction qui englobe tous les cas?
    (Même si apparemment, il faudrait utiliser la fonction la plus légère, qui ne protège que ce que l'on a besoin de protéger.)

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Bonjour,

    Effectivement ces fonctions sont assez comliquées; mais je sens qu'on arrivera à trouver une solution.

    %BQUOTE and %NRBQUOTE ajissent au moment de l'exécution.
    %STR and %NRSTR agissent au moment de la compilation

    Ci dessous un extrait du sashelp:

    %BQUOTE and %NRBQUOTE Functions
    Mask special characters and mnemonic operators in a resolved value at macro execution
    ' " ( ) + - * / < > = ¬ ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT
    %NRBQUOTE masks & %

    %STR and %NRSTR Functions
    Mask special characters and mnemonic operators in constant text at macro compilation
    + - * / < > = ¬ ^ ~ ; , blank
    AND OR NOT EQ NE LE LT GE GT
    They also mask the following characters when they occur in pairs and when they are not matched and are marked by a preceding % : ' " ( )
    In addition, %NRSTR also masks the following characters: & %

    Est ce que tu peux nous dire ce que tu veux faire avec ta chaine?

    Cordialement

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut
    Effectivement ces fonctions sont assez comliquées;
    Ouf! je suis normal!

    Dans ce cas ci cette chaîne est placée par après dans un dataset.
    Plus tard, je compte utiliser ces valeurs (du dataset) avec un gprint.

    Ici, je n'ai pas besoin que mes chaînes deviennent des instructions.
    Donc, j'aurais besoin d'effecuter un quoting à la compilation et à l'exécution. (si j'ai bien compris?)


    %BQUOTE and %NRBQUOTE Functions
    Mask special characters and mnemonic operators in a resolved value at macro execution
    ' " ( ) + - * / < > = ¬ ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT
    %NRBQUOTE masks & %
    %STR and %NRSTR Functions
    Mask special characters and mnemonic operators in constant text at macro compilation
    + - * / < > = ¬ ^ ~ ; , blank
    AND OR NOT EQ NE LE LT GE GT
    They also mask the following characters when they occur in pairs and when they are not matched and are marked by a preceding % : ' " ( )
    In addition, %NRSTR also masks the following characters: & %
    Ce que je trouve bizarre (par rapport à d'autres langages de programmation), c'est que j'ai l'impression qu'en SAS je dois savoir par coeur quels sont les char qui doivent être quotés.
    Apparemment, il n'y a pas une fonction qui me permet de faire un quoting pour tous les char à la compilation at à l'exécution.

    D'une manière plus générale: pouvoir quoter l'esprit tranquille
    En effet, j'ai peur de parfois oublier qu'un certain char doit être quoté...

  4. #4
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut


    Je te propose de poster un partie de ton code, pour qu'on puisse la faire ensemble.

  5. #5
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut
    Merci beaucoup mais j'ai la solution dans le cas de mon problème.
    Donc voici la chaîne qui me pose problème:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %let msg_text = Problème d%str(%')intégrité [Guarantee -> Client (1,1) XOR Guarantee --> Auth/Guar (1,n)] : Les références ont été placées dans la table &dsname. (&nbobs observations).;
    Cela fonctionne en mettant %str.
    C'était surtout pour savoir s'il n'existait pas une fonction générale.
    Comme expliqué dans le précédent post
    Ce que je trouve bizarre (par rapport à d'autres langages de programmation), c'est que j'ai l'impression qu'en SAS je dois savoir par coeur quels sont les char qui doivent être quotés.
    Apparemment, il n'y a pas une fonction qui me permet de faire un quoting pour tous les char à la compilation at à l'exécution.

    D'une manière plus générale: pouvoir quoter l'esprit tranquille
    En effet, j'ai peur de parfois oublier qu'un certain char doit être quoté...
    Donc la seule solution c'est de connaître par coeur tous les char qui peuvent poser problème?

    C'est tout de même moins évident. (Par exemple si j'oublie que j'ai mis une virgule sans la quoter). Ce serait beaucoup plus facile avec une fonction qui quote automatiquement tous les char qui peuvent poser problème.
    Comme ça je dois pas apprendre toute la liste par coeur


    Sinon,
    %STR and %NRSTR Functions
    Mask special characters and mnemonic operators in constant text at macro compilation
    + - * / < > = ¬ ^ ~ ; , blank
    Je comprends pas très bien pourquoi quand j'écris (1,n).
    Cela fonctionne sans que je quote la virgule.

    Déjà merci pour ton aide bahraoui.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Salut L0007,

    Je comprends pas très bien pourquoi quand j'écris
    Cela fonctionne sans que je quote la virgule(1,n)
    L'interpréteur de SAS est un tout petit peu intelligent : s'il rencontre une parenthèse ouvrante à l'intérieur de ce qu'il croit être une valeur de paramètre, il s'attend à ce que la première parenthèse fermante ")" fasse aussi partie de la valeur du paramètre et ainsi pour tout ce qui se trouve entre les 2 parenthèses. Donc ta virgule entre parenthèses est interprétée comme faisant partie de la valeur transmise au paramètre. C'est aussi la raison pour laquelle tu n'as pas à protéger les couples de parenthèses (1ouvrante+1 fermante) mais seulement les parenthèses "isolées".

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut
    OK

    Merci à vous.

    Et donc (je sais, je me répète) , pour conclure on peut me confirmer que, pour bien "quoter" (Je finis par adorer ce verbe!):
    + La seule solution c'est de connaître par coeur tous les char qui peuvent poser problème (Ce qui permet de savoir comment bien quoter).

    + Il n'existe pas une fonction de quoting qui protège toute cette liste (à la compil et à l'éxécution en même temps.

    -->Il faut donc faire super attention à ne pas oublier un char qui pourrait poser problème.


    Je peux conclure la-desssus?

    PS:
    L'interpréteur de SAS est un tout petit peu intelligent

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    il y a %superq sinon...

  9. #9
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut
    Parfait!

    Merci à tous!

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/11/2014, 10h57
  2. Fonction Trim Substr Str Left Right etc. . .
    Par Haache dans le forum SAS Base
    Réponses: 2
    Dernier message: 11/09/2014, 11h38
  3. Utilisation de %nrstr, %quote, %str
    Par Mamouthy dans le forum Macro
    Réponses: 5
    Dernier message: 25/04/2013, 17h34
  4. Les mystère de la fonctions sw.WriteLine(str);
    Par Milorion dans le forum C#
    Réponses: 4
    Dernier message: 30/10/2010, 12h19

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