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 :

%substr d'une macro variable comment faire ce que l'on veut ?


Sujet :

Macro

  1. #1
    Membre à l'essai
    Homme Profil pro
    consultant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Points : 14
    Points
    14
    Par défaut %substr d'une macro variable comment faire ce que l'on veut ?
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data test;
    cible='  ground';
    run;
    data test1;
    cible='floor';
    run;
    data test2;
    cible='level';
    run;
    data test3;
    cible=' high';
    run;
    data all; set test test1-test3;
    run;


    Mon dataset ALL contient une variable appellee cible. Certaine valeur de la vairable cible commence avec au moins un espace ( ce sont la valeurs ground et high)

    L'instruction que je veux executer est la suivante : retenir que les variables dont le premier element est un espace. Le code que j'utilise est le suivant ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data all_1; set all;
    where substr(cible,1,1) eq ' ';
    run;
    le probleme apparait lorsque je veux executer ce code dans le cadre d'une macro; en effet, je compte executer ce type de code pour plusieur dataset et sur plusieurs variables donc j'excute le code suivant que vous pouves aussi executer...


    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
    28
     
    options mprint mlogic symbolgen;
     
    %macro ext;
     
    PROC SQL noprint;
     SELECT DISTINCT  name  INTO :nam 
     FROM sashelp.vcolumn 
     WHERE libname='WORK' and memname='ALL' ;
    QUIT;
     
     
    %put &nam;
     
    proc sql;
    create table ext as
    select *
    where %substr(&nam,1,1)=" ";
    quit;
     
     
    data all_1; set all;
    where %substr(&nam,1,1) eq ' ';
    run;
     
    %mend ext;
     
    %ext

    Ma log contient des erreurs. Le probleme survient au moment de l'instruction %substrt.

    je m'explique, &nam est egal a cible. Au lieu de faire substr(cible,1,1) egal a selon les cas ' ','f', 'l' et ' ', il me donne 'c' cad la premiere lettre de ma macro variable. Pourquoi dans le cas hors macro cela fonctionne, et pas dans le cas macro ? Dois-je ajouter une macro fonction ? Avez-vous des suggestions pour proceder autrement ?


    Merci d'avance

    Proc_man

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Hello,

    Comportement cohérent ... le premier caractère de la macro variable &nam résolue est bien "c" ! (cible est une variable et pas une macro variable)

    Pas besoin d'utiliser %substr dans tes programmes ... substr suffit.

  3. #3
    Membre actif Avatar de tdiallo
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 118
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Tu peux essayer ce code:

    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
    28
    29
     
     
     
    %macro ext;
     
    PROC SQL noprint;
     SELECT DISTINCT  name  INTO :nam 
     FROM sashelp.vcolumn 
     WHERE libname='WORK' AND memname='ALL' ;
    QUIT;
     
     
    %put &nam;
     
    proc sql;
    CREATE TABLE ext AS
    SELECT *
    from all
    WHERE substr(&nam,1,1)=" ";
    quit;
     
     
    DATA all_1; 
    	SET ALL (WHERE=(substr(&nam,1,1) eq ' '));
    run;
     
    %mend ext;
     
    %ext

  4. #4
    Membre à l'essai
    Homme Profil pro
    consultant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Points : 14
    Points
    14
    Par défaut
    Bonjour,


    Merci ! En effet, l'utilisation de substr au lieu de %substr a suffit pour corriger l'erreur.

    Cordialement

    proc_man

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/03/2014, 20h40
  2. Réponses: 2
    Dernier message: 23/07/2012, 11h08
  3. Réponses: 2
    Dernier message: 22/03/2010, 16h26
  4. Réponses: 5
    Dernier message: 16/09/2008, 18h28
  5. Réponses: 9
    Dernier message: 14/04/2008, 12h58

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