BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
clarkchong1
Fluorite | Level 6

I have the following macro variable definitions:

%LET text1 = a;

%LET text2 = %STR(b,c,d);

 

What do I need to do to create text3 from &text1 and &text2, which is equivalent to assigning:

%LET text3 = %STR(a,b,c,d);

?

I need the resulting text3 to be able to be used as &value in the following sample code:

http://support.sas.com/kb/26/155.html

 

Thank you!

1 ACCEPTED SOLUTION

Accepted Solutions
novinosrin
Tourmaline | Level 20

%LET text1 = a;

%LET text2 = %STR(b,c,d);

%let text3=%bquote(&text1,&text2);

%put &text3;


%loop(&text3)

View solution in original post

10 REPLIES 10
novinosrin
Tourmaline | Level 20

%LET text1 = a;

%LET text2 = %STR(b,c,d);

%let text3=%bquote(&text1,&text2);

%put &text3;


%loop(&text3)
ballardw
Super User

Are you sure you need that particular code?

You can get the same result without any commas:

%macro loopalt(values);    
                                                                                                                
     /* Count the number of values in the string */                                                                                                                                   
     %let count=%sysfunc(countw(&values)); 

     /* Loop through the total number of values */                                                                                         
     %do i = 1 %to &count;                                                                                                              
      %let value=%scan(&values, &i);                                                                                            
      %put &value;                                                                                                                      
     %end;                                                                                                                                 
%mend;   
%loopalt(2 3 5 7 11 13 17 )

In general introducing commas and/or quotes into macro variables seems to cause more headaches than needed for most cases.

clarkchong1
Fluorite | Level 6
That's a great idea! How do one then combine text1 and text2 below to get text3?
%LET text1 = a b;
%LET text2 = c d;
%LET text3 = a b c d;
Thanks!
ballardw
Super User

@clarkchong1 wrote:
That's a great idea! How do one then combine text1 and text2 below to get text3?
%LET text1 = a b;
%LET text2 = c d;
%LET text3 = a b c d;
Thanks!
%LET text1 = a b;
%LET text2 = c d;
%let text3 = &text1. &text2.;

%put text3= &text3.;
clarkchong1
Fluorite | Level 6

Ah. That's obvious, wasn't it? Thank you!

Tom
Super User Tom
Super User

Why are you adding the macro quotes?

%LET text2 =1,5,9;

Then you can use the value a DO statement.

data test;
  do x=&text2;
    output;
  end;
run;
clarkchong1
Fluorite | Level 6

Thanks for the suggestion!

I need to execute a macro functions with various input, with input defined by items in a comma delimited list supplied by the user. So I can't just do it in a data step.

 

ScottBass
Rhodochrosite | Level 12

@clarkchong1 wrote:

Thanks for the suggestion!

I need to execute a macro functions with various input, with input defined by items in a comma delimited list supplied by the user. So I can't just do it in a data step.

 


I hate commas in macro lists, especially if that list is then a parameter to another macro or macro function.  It's nothing but headaches.

 

You said "comma delimited list supplied by the user":

 

1) Is that a macro variable supplied by the user, or some other "list"?

2) Can the user supply it as just a delimited (space or some other character) list?

 

I prefer "injecting" commas at "run time" via the %seplist macro:

https://github.com/scottbass/SAS/blob/master/Macro/seplist.sas

 

Here are some sample invocations:

 

%put %seplist(a b c);
%put %seplist(a b c,nest=q);
%put %seplist(a b c,nest=qq);
%put %seplist(a b c,prefix=a.),%seplist(d e f,prefix=b.);  * say for a SQL SELECT column list ;
%put %seplist(%bquote(a,b,c),indlm=%str(,));  * if you insist on embedded commas then you have to quote the argument ;
%put %seplist(hello scott^how are you^i am well thanks,indlm=^);  * if items contain spaces ;
%put %seplist(hello scott^how are you^i am well thanks,indlm=^,dlm=|);

 

 

 


Please post your question as a self-contained data step in the form of "have" (source) and "want" (desired results).
I won't contribute to your post if I can't cut-and-paste your syntactically correct code into SAS.
LeonidBatkhan
Lapis Lazuli | Level 10

It's even simpler than that. You can have

 

%let text1 = 2;
%let text2 = 3,5,7,11,13,17;
%let text3 = &text1,&text2;

 

To check it out just run

 

%put &text3;

 

and you will get in SAS log:

 

2,3,5,7,11,13,17

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 7676 views
  • 8 likes
  • 6 in conversation