1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    976
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 976
    Points : 561
    Points
    561

    Par défaut %let VS call symput(s)

    Bonjour ,

    Je souhaiterais l'avis d'un spécialiste car je m'arrache les cheveux pour des déclarations de variables . Je veux que avoir une variable qui aura comme valeur :

    jour jour
    avec un espace .

    Voici deux code SAS bateau :

    Code SAS : 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
    %let jour = "jour jour";
    %let jour2 = 'jour jour';
    %let jour3 = 'jour';
    %let jour4 = "jour";
    %let jour5 = "jour jour"n;
    %let jour6 = 'jour jour'n;
    %let jour7 = 'jour'n;
    %let jour8 = "jour"n;
     
    %put &jour &jour2 &jour3 &jour4 &jour5 &jour6 &jour7 &jour8 ;
     
    /* VS */
     
    data _null_;
     
    call symputx('jour10','jour');
    call symputx('jour11','jour jour');
    call symputx('jour12',"jour");
    call symputx('jour13',"jour jour");
     
    run;
     
    %put &jour10 &jour11 &jour12 &jour13

    Sortie de journal/log SAS :

    Code SAS log : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    NOTE: Writing TAGSETS.SASREPORT13(EGSR) Body file: EGSR
    22         
    23         GOPTIONS ACCESSIBLE;
    24         %let jour = "jour jour";
    25         %let jour2 = 'jour jour';
    26         %let jour3 = 'jour';
    27         %let jour4 = "jour";
    28         %let jour5 = "jour jour"n;
    29         %let jour6 = 'jour jour'n;
    30         %let jour7 = 'jour'n;
    31         %let jour8 = "jour"n;
    32         
    33         %put &jour &jour2 &jour3 &jour4 &jour5 &jour6 &jour7 &jour8 ;
    SYMBOLGEN:  Macro variable JOUR resolves to "jour jour"
    SYMBOLGEN:  Macro variable JOUR2 resolves to 'jour jour'
    SYMBOLGEN:  Macro variable JOUR3 resolves to 'jour'
    SYMBOLGEN:  Macro variable JOUR4 resolves to "jour"
    SYMBOLGEN:  Macro variable JOUR5 resolves to "jour jour"n
    SYMBOLGEN:  Macro variable JOUR6 resolves to 'jour jour'n
    SYMBOLGEN:  Macro variable JOUR7 resolves to 'jour'n
    SYMBOLGEN:  Macro variable JOUR8 resolves to "jour"n
    "jour jour" 'jour jour' 'jour' "jour" "jour jour"n 'jour jour'n 'jour'n "jour"n
    34         
    35         data _null_;
    36         
    37         call symputx('jour10','jour');
    38         call symputx('jour11','jour jour');
    39         call symputx('jour12',"jour");
    40         call symputx('jour13',"jour jour");
    41         
    42         run;
     
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
     
    2                                                          The SAS System                            10:51 Monday, November 27, 2017
     
     
    43         
    44         %put &jour10 &jour11 &jour12 &jour13;
    SYMBOLGEN:  Macro variable JOUR10 resolves to jour
    SYMBOLGEN:  Macro variable JOUR11 resolves to jour jour
    SYMBOLGEN:  Macro variable JOUR12 resolves to jour
    SYMBOLGEN:  Macro variable JOUR13 resolves to jour jour
    jour jour jour jour jour jour
    45         
    46         GOPTIONS NOACCESSIBLE;
    47         %LET _CLIENTTASKLABEL=;
    48         %LET _CLIENTPROJECTPATH=;
    49         %LET _CLIENTPROJECTNAME=;
    50         %LET _SASPROGRAMFILE=;
    51         
    52         ;*';*";*/;quit;run;
    53         ODS _ALL_ CLOSE;
    54         
    55         
    56         QUIT; RUN;
    57

    Si j'utilise le %let ma valeur sera :

    "jour jour"
    ou bien

    'jour jour'
    avec le call symput(s) :

    jour jour
    C'est la merde quand même ces quotes dans le %let quand on doit utiliser des noms répertoires avec espaces !

    Pour cela que je me méfie de %let comme la peste et que j'utilise le call symput(s) . A moins d'une solution de contournement ?

  2. #2
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut %let VS call symput

    Bonjour,

    Vous mélangez deux choses. J'ai dit qu'il fallait mettre des guillemets pour définir un nom de fichier, pas pour définir une macro variable avec l'instruction %let :

    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
    1    %let chemin=D:\temp temp;
    2    %let fichier=test.txt;
    3
    4    data test;
    5      V1="test";
    6      file "&chemin.\&fichier";
    7      put V1;
    8    run;
     
    NOTE: The file "D:\temp temp\test.txt" is:
          Nom du fichier=D:\temp temp\test.txt,
          RECFM=V,LRECL=32767,
          Taille de fichier (octets)=0,
          Modifié(e) le=27 novembre 2017 17 h 28,
          Heure de création=27 novembre 2017 17 h 16
     
    NOTE: 1 record was written to the file "D:\temp temp\test.txt".
          The minimum record length was 4.
          The maximum record length was 4.
    NOTE: The data set WORK.TEST has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
    L'instruction call symput est utile lorsque la macro variable dépend du contenu de la table, voir ici.

    Cordialement,

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    976
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 976
    Points : 561
    Points
    561

    Par défaut

    Bonjour,

    Après de très nombreux tests j'obtiens bien un résultat concluant pour passer la variable qui vient du %let :

    Avec ceci :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %let lien = '\\serveur\sous - dossier\dossiertoto\' ;
     
    Data _null_
     
    fic1=&lien; /* donne > \\serveur\sous - dossier\dossiertoto\ */ /* cas permettant de remonter un nombre si le %let est numérique */
    fic2='&lien'; /* donne > &lien */
    fic3="&lien"; /* donne > \\serveur\sous - dossier\dossiertoto\ */ /* cas permettant de remonter une chaine si le %let est numérique */
     
    Run;

    Voir page 5 de cette documentation : https://support.sas.com/rnd/papers/s..._Dont_Work.pdf

    year1=1939; > num, 1939
    year2='&year'; > char, &year
    year3="1939"; > char, 1939
    Je prend bonne des informations communiquées.

    Correction faite.

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

Discussions similaires

  1. [Macro] la macro call symput
    Par r_dani dans le forum Macro
    Réponses: 2
    Dernier message: 17/10/2008, 16h03
  2. Réponses: 4
    Dernier message: 10/07/2008, 16h51
  3. macro avec call symput
    Par kabstat dans le forum Macro
    Réponses: 14
    Dernier message: 05/07/2008, 00h08
  4. erreur sur call symput
    Par Tyler Durden dans le forum Macro
    Réponses: 12
    Dernier message: 28/05/2008, 18h25
  5. utilisation du call symput
    Par mioke dans le forum Macro
    Réponses: 14
    Dernier message: 13/05/2008, 12h42

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