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 :

Call symput d'une chaîne de caractère contenant un apostrophe


Sujet :

Macro

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut Call symput d'une chaîne de caractère contenant un apostrophe
    Bonjour,

    Je souhaite récupérer la liste des labels d'un dataset en macro-variable.
    Mais certains de mes labels contiennent des apostrophes, mon programme s'arrête donc à cause de cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SYMBOLGEN:  Some characters in the above value which were subject to macro quoting have been unquoted for printing.
    ERROR: Literal contains unmatched quote.
    ERROR: The macro TEST will stop executing.
    J'ai essayé de reproduire ce que je fais, mais bien que ça y ressemble vraiment je n'ai pas d'erreur dans cette situation.

    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
    30
    31
    32
    33
    34
    data test;
    	input VAR_IND VAR_GRP $;
    	label VAR_IND="Variable de l'individu"
    		  VAR_GRP="Variable du groupe";
    	datalines;
    	1 A
    	2 B
    	3 A
    	;
    run;
     
    proc contents data=test out=test_conts;
    run;
     
    %let VAR1=VAR_IND;
    %let VAR2=VAR_GRP;
    %let LST=;
     
    %macro a;
    %do i=1 %to 2;
     
    	data _null_;
    		set test_conts;
    		if NAME eq "&&VAR&i." then call symput("LABELP&i.",cats(" ","(",trim(left(%bquote(LABEL))),")"));
    	run;
     
    	%let LST=%bquote(&LST.) &&VAR&i %bquote(&&LABELP&i) / ;
     
    	%end;
    %mend a;
     
    %a;
     
    %put &LST;
    J'ai quand même ce message lorsque je met l'option symbolgen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SYMBOLGEN:  Some characters in the above value which were subject to macro quoting have been unquoted for printing
    Savez-vous comment je pourrais fixer ce problème ?

    Merci par avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Est-ce que le résultat souhaité de la macro variable est comme ceci :
    VARIABLE DE L'INDIVIDU / VARIABLE DU GROUPE

    Hoss

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Pas exactement, plutôt :
    VAR_IND (Variable de l'individu) / VAR_GRP (Variable du groupe)

    Dans mon programme original il y a encore une autre macro-variable ajouté mais je n'ai pas de difficulté à l'ajouter.
    Ça ressemble à :
    VAR_IND (Variable de l'individu) indicateur de 4 / VAR_GRP (Variable du groupe)

    (Pas "d'indicateur" pour les variables quali. Et en imaginant dans mon exemple que VAR_IND est une "vraie" variable quanti pas comme l'identifiant du sujet).

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Tu peux donc essayer ceci ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    proc sql ;
    select catt( upcase(name), '(', label, ')' ) 
    into :labelist separated by "/"
    from dictionary.columns
    where libname='WORK' and memname='TEST';
    quit;
    Ward

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Merci Hoss, ça fonctionne pour un cas général mais finalement pas par rapport à ce que je souhaitais. J'avais pas donné assez de détails finalement.

    Je ne veux pas récupérer le label de toutes les variables mais seulement celles qui m'intéresse. Et je souhaite la liste VAR (label) pour les variables quanti et une autre liste pour les variables quali.

    Ci-dessous, tu peux trouver un exemple plus ressemblant de ce que je souhaite.
    Avec TAB1, ça ne fonctionne pas car mes labels contiennent des apostrophes.
    Mais avec TAB2, en supprimant les apostrophes, j'obtiens ce que je souhaite, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %put &&LABEL&VAR_INT.;
    %put &LSTN.;
    %put &LSTC.;
     
    (Prix des achats)
    AGE_ENF (Age de lenfant) indicateur 1/ AGE_ADU (Age de ladulte) indicateur 2/ NB_ACH (Nombre dachat(s)) indicateur 3/
    FUM (Ladulte fume t-il ?) /
    Le programme :
    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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    data TAB1;
    	input IND GRP $ AGE_ENF AGE_ADU FUM $ NB_ACH PRIX;
    	label IND="Individu"
    		  GRP="Groupe"
    		  AGE_ENF="Age de l'enfant"
    		  AGE_ADU="Age de l'adulte"
    		  FUM="L'adulte fume t-il ?"
    		  NB_ACH="Nombre d'achat(s)"
    		  PRIX="Prix des achats";
    	datalines;
    	1 A 12 44 OUI 10 100
    	2 B 5 41 OUI 1 10
    	3 A 9 38 NON 5 50
    	;
    run;
     
    data TAB2;
    	input IND GRP $ AGE_ENF AGE_ADU FUM $ NB_ACH PRIX;
    	label IND="Individu"
    		  GRP="Groupe"
    		  AGE_ENF="Age de lenfant"
    		  AGE_ADU="Age de ladulte"
    		  FUM="Ladulte fume t-il ?"
    		  NB_ACH="Nombre dachat(s)"
    		  PRIX="Prix des achats";
    	datalines;
    	1 A 12 44 OUI 10 100
    	2 B 5 41 OUI 1 10
    	3 A 9 38 NON 5 50
    	;
    run;
     
    %macro a (TAB);
    	proc contents data=&TAB. out=&TAB._CONTS;
    	run;
     
    	%let VAR_INT=PRIX;
    	%let VAR1=AGE_ENF;
    	%let VAR2=AGE_ADU;
    	%let VAR3=NB_ACH;
    	%let VAR4=FUM;
    	%let TYPE1=N;
    	%let TYPE2=N;
    	%let TYPE3=N;
    	%let TYPE4=C;
    	%let IND1=1;
    	%let IND2=2;
    	%let IND3=3;
    	%let LSTN=;
    	%let LSTC=;
     
    	data _null_;
    		set	&TAB._CONTS;
    		if NAME eq "&VAR_INT" then call symput("LABEL&VAR_INT.",cats(" ","(",trim(left(LABEL)),")"));
    	run;
     
    	%do i=1 %to 4;
    		data _null_;
    			set	&TAB._CONTS;
    			if NAME eq "&&VAR&i." then call symput("LABEL&i.",cats(" ","(",trim(left(LABEL)),")"));
    		run;
     
    		%if &&TYPE&i eq N %then %do;
    			%let LSTN=&LSTN. &&VAR&i &&LABEL&i indicateur &&IND&i/ ;
    		%end;
     
    		%if &&TYPE&i eq C %then %do;
    			%let LSTC=&LSTC. &&VAR&i &&LABEL&i / ;
    		%end;
    	%end;
     
    	%put &&LABEL&VAR_INT.;
    	%put &LSTN.;
    	%put &LSTC.;
    %mend;
     
    %a(TAB=TAB2);

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    La macro suivante %MacLabels_NumCar répond parfaitement au cas particulier dans le quel tu souhaites récupérer les labels des variables par type : numériques ou caractères. Trois paramètres à définir, dans ce cas, pour cette macro :
    1) Ds= le nom de la table
    2) Type= le type de la variable : 1 si le type, des variables à choisir, est numérique. 2 si le type est caractère.
    3) Vexclues=la ou les variables, séparées par un blanc, à exclure parmi les variables choisies de chaque type.

    Note : la fonction monotonic() crée le numéro de l'indicateur qui est l'ordre de la variable dans la table sortie de proc contents à près la selection par type.
    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
    30
    31
    32
    33
     
    data TAB1;
    	input IND GRP $ AGE_ENF AGE_ADU FUM $ NB_ACH PRIX;
    	label IND="Individu"
    		  GRP="Groupe"
    		  AGE_ENF="Age de l'enfant"
    		  AGE_ADU="Age de l'adulte"
    		  FUM="L'adulte fume t-il ?"
    		  NB_ACH="Nombre d'achat(s)"
    		  PRIX="Prix des achats";
    	datalines;
    	1 A 12 44 OUI 10 100
    	2 B 5 41 OUI 1 10
    	3 A 9 38 NON 5 50
    	;   run;
    %macro MacLabels_NumCar (Ds=, Type=, Vexclues=) ;
    proc contents data=&ds. (drop=&vexclues.)  
    out=lab_contents( keep=name label type where=(type=&type.) ) noprint ; 
    run ;
    proc sql noprint ;
    %if &Type.=1 %then %do ;
    select catt( upcase(name), ' (', label, ') ', ' indicateur ', monotonic() ) 
    into : LSTN	separated by "/"
    				  %end ;
    %else              %do ;
    select catt( upcase(name), ' (', label, ') ' ) 
    into : LSTC	separated by "/"
    				  %end ;
    from lab_contents ; 
    quit ;	%PUT _USER_ ;
    %mend MacLabels_NumCar ;
    %MacLabels_NumCar (Ds=TAB1, Type=1, Vexclues=Ind PRIX) ;
    %MacLabels_NumCar (Ds=TAB1, Type=2, Vexclues=GRP) ;
    Cordialement
    Ward

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Je vais travailler là dessus.

    Merci beaucoup Ward pour tes réponses et ta macro.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/01/2014, 14h31
  2. Réponses: 3
    Dernier message: 02/11/2011, 18h46
  3. [MySQL] Affichage d’une chaîne de caractères contenant des parenthèses
    Par mathiotp dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/11/2007, 20h31
  4. Réponses: 15
    Dernier message: 10/08/2007, 09h33
  5. Tri sur une chaîne de caractères contenant des nombres
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 11h52

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