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 :

Comment savoir si une macro-variable est numérique ou texte ?


Sujet :

Macro

  1. #1
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut Comment savoir si une macro-variable est numérique ou texte ?
    Bonjour,

    Je voudrais vérifier, au sein d'une macro, si le contenu de macro-variables est numérique ou texte, de façon à mettre les variables texte entre quote et laisser les variables numériques tel quelles. Je sais qu'une macro-variable est toujours du texte, mais si le contenu représente un nombre, il doit y avoir moyen de le savoir non ?

    Merci d'avance.

  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,

    J'ai déja eu ce problème, la solution que j'ai trouvé : supprimer les numériques de ma chaîne, si il reste des choses => chaine caractère sinon que du numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %let toto1=12trt21;
    %let test1=%sysfunc(compress(&toto1,1234567890));
    %put RESTE "&test1";
    %let toto2=1221;
    %let test2=%sysfunc(compress(&toto2,1234567890));
    %put RESTE "&test2";
    Cordialement.

  3. #3
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Oki, c'est tordu. Je me demandais justement si il n'existait pas une fonction qui évaluait la chose...

    Par contre, si c'est un décimal, ça ne passe pas... Faudrait voir si avec %eval y'a pas moyen de faire quelque chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %macro test;
    	%let toto=abc;
    	%put &toto;
    	%if %eval(&toto+1) %then %do;
    		%put Numeric ;
    	%end
    	%else %put Character ;
    %mend;
    %test;
    Avec ça, j'arrive à définir si la variable est numérique, par contre, si c'est du texte, ça plante. Peut-être y-a-t'il un moyen de gérer une exception ? Je ne sais pas si c'est faisable en SAS...



    Edit : ou alors avec un %sysfunc(format &toto) ou un truc qui ressemble à ça, c'est pas faisable ? En voyant le résultat peut-être qu'on peut définir si c'est un numérique ou pas... Je ne sais pas bien utiliser les format et informat moi...

  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
    J'avais déja vu une fonction (nom une macro) mais je ne me rappelle pas du nom.

    Pour le problème des décimales tu peux ajouter le "." à la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    %let toto1=12trt21;
    %let test1=%sysfunc(compress(&toto1,1234567890.));
    %put RESTE "&test1";
    %let toto2=1221;
    %let test2=%sysfunc(compress(&toto2,1234567890.));
    %put RESTE "&test2";
    %let toto3=12.21;
    %let test3=%sysfunc(compress(&toto3,1234567890.));
    %put RESTE "&test3";

  5. #5
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Ok, voilà une petite macro qui renvoie le type de la macro variable :

    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
    26
    27
    %macro verif_num_char_dec(var);
    	%let toto=%sysfunc(compress(&var,1234567890));
    	%let type=;
    	%if %length(&toto)=0 %then %do;
    		%let type=Numeric;
    	%end;
    	%else %let type=Text;
    	%if &type=Text %then %do;
    		%let toto=%sysfunc(compress(&var,1234567890.));
    		%if %length(&toto)=0 %then %do;
    			%let type=Decimal;
    		%end;
    	%end;
    	%put &type;
    	&type;
    %mend;
     
    %let titi1=%verif_num_char_dec(&toto1);
    %put &titi1;
    %let titi2=%verif_num_char_dec(&toto2);
    %put &titi2;
    %let titi3=%verif_num_char_dec(&toto3);
    %put &titi3;
     
    %put &titi1;
    %put &titi2;
    %put &titi3;
    Ne reste plus ensuite qu'à vérifier le contenu avec cette macro par exemple :
    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
    %macro verif(var);
    %let titi4=%sysfunc(compress(%verif_num_char_dec(&var),%str(%;)));
    %put huhu **&titi4**;
    %if &titi4=Numeric %then %do;
    	/* Traitement pour une variable numérique*/
    	%put var &var is numeric;
    %end;
    %else %if &titi4=Decimal %then %do;
    	/* Traitement pour une variable décimale*/
    	%put var &var is decimal;
    %end;
    %else %if &titi4=Text %then %do;
    	/* Traitement pour une variable texte*/
    	%put var &var is text;
    %end;
    %else %put "Attention type non défini !!!";
    %mend;
    %verif(&toto3);

    Si ça peut être utile à quelqu'un d'autre...


    ps : par contre, si vous constatez une erreur, précisez-le...

  6. #6
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    On peut aussi tester avec la fonction input :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    %macro verif_num_char(string);
    	data _NULL_;
    		var=input("&string" ,?? COMMA8.);
    		if var=. then call symput('type','CHAR');
    		else call symput('type','NUM');
        run;
    	%put &type;
    %mend;
    %let toto=12,3;
    %verif_num_char(%quote(&toto));
    input converti la chaine en numérique, si ce n'est pas possible alors var=. et une erreur "Invalid Data" s'affiche dans la log.
    Les ?? signifie qu'on affiche pas l'erreur dans la log.
    COMMA8. permet la présence de la virgule pour les décimales. ex: 12,3 et 12.3 sont considérés comme des numériques.

    Attention : 12e3 est considéré par SAS comme du numérique (12 exponentiel 3)

  7. #7
    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 ne connaissais pas l'histoire des "??".
    Trop fort

  8. #8
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    ouai c'est pas très connu pourtant bien utile !

    c'est en regardant la doc que j'ai vu ça :

    INPUT Function

    Returns the value produced when a SAS expression that uses a specified informat expression is read Category: Special

    Syntax
    INPUT(source, <? | ??>informat.)

    Arguments

    source
    contains the SAS character expression to which you want to apply a specific informat.

    ? or ??
    The optional question mark (?) and double question mark (??) format modifiers suppress the printing of both the error messages and the input lines when invalid data values are read. The ? modifier suppresses the invalid data message. The ?? modifier also suppresses the invalid data message and, in addition, prevents the automatic variable _ERROR_ from being set to 1 when invalid data are read.

    informat.
    is the SAS informat that you want to apply to the source.

  9. #9
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Intéressant, et ce ?? est disponible uniquement avec les FORMAT/INFORMAT ?

  10. #10
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Intéressant, et ce ?? est disponible uniquement avec les FORMAT/INFORMAT ?
    c'est uniquement réservé pour input.

    Pour revenir à ton post, avec SAS V9, une autre solution pour tester le type est de voir avec les expressions régulières au travers des fonctions rxparse et rxmatch ... mais là j'ai la flemme de chercher

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

Discussions similaires

  1. Comment savoir si une fenetre modale est ouverte
    Par franckcl dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/12/2006, 15h11
  2. [C#] Comment savoir si une connexion SQL est disponible ?
    Par mister3957 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 19/10/2006, 10h53
  3. Comment savoir si une fenêtre s'est fermée
    Par niuniuk36 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 12/05/2005, 14h49
  4. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 20h49
  5. Réponses: 4
    Dernier message: 10/09/2002, 17h09

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