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

I have couple of macro variables which has values and I want to create a list of those values for each variable into one and the final list should be

 

 

%let xp1 = 2;

%let xp2 = 3;

%let xp3 = 1;

 

 %do i=1 %to 3;
   %if &i=1 %then %do;
 %let y = &&xp&i._crs;
      %end;
 %else %do;
      %let y =%sysfunc(catx(|,&y,&&xp&i._crs));
 %end;

%end;


 %put &y;

so value of y should be 2|3|1  after the loop is completed

 

Can anyone please help

1 ACCEPTED SOLUTION

Accepted Solutions
novinosrin
Tourmaline | Level 20

And i am baffled why this is troubling me

 



%let xp1 =2;

%let xp2 =3;

%let xp3 =1;
/*works fine*/
%let list=%sysfunc(catx(|,&xp1,&xp2,&xp3));

%put &list;
/*does not work*/
%macro l;
%let list=%str();
%do i=1 %to 3;
%put &&xp&i;
%let list=%sysfunc(catx(|,&list,&&xp&i));
%end;
%mend l;
%l
%put &list;

View solution in original post

23 REPLIES 23
Cynthia_sas
SAS Super FREQ
Hi, where does the "_crs" fit -- when you show the value of &Y, you do NOT show the string _crs.

I would expect you to get messages of the form:
WARNING: Apparent symbolic reference XP1_CRS not resolved.
and I would expect you'd see those messages for each of your XP1, XP2 and XP3 macro variables.

What is the purpose of the _crs???

Cynthia
jhh197
Pyrite | Level 9

 

oh the % let statements should be like below

 

%let xp1_crs = 2;

%let xp2_crs = 3;

%let xp3_crs = 1;

novinosrin
Tourmaline | Level 20

%let xp1 =2;

%let xp2 =3;

%let xp3 =1;


%macro l;
%let list=%str();
%do i=1 %to 3;
%put &&xp&i;
%let list=&list|&&xp&i;
%end;
%mend l;
%l
novinosrin
Tourmaline | Level 20

And i am baffled why this is troubling me

 



%let xp1 =2;

%let xp2 =3;

%let xp3 =1;
/*works fine*/
%let list=%sysfunc(catx(|,&xp1,&xp2,&xp3));

%put &list;
/*does not work*/
%macro l;
%let list=%str();
%do i=1 %to 3;
%put &&xp&i;
%let list=%sysfunc(catx(|,&list,&&xp&i));
%end;
%mend l;
%l
%put &list;
jhh197
Pyrite | Level 9

Yes . the first code would work and can be used when we have three variables . But I wanted to do this in a do loop since I don't want to mention &x1 , &x2 , &x3 as  I have 250 variables from x1 to x250

 

 

 

 

Thank you

novinosrin
Tourmaline | Level 20

did you try the previous post of mine

 

here again

 

%let xp1 =2;

%let xp2 =3;

%let xp3 =1;


%macro l;
%let list=%str();
%do i=1 %to 3;
%put &&xp&i;
%let list=&list|&&xp&i;
%end;
%mend l;
%l
novinosrin
Tourmaline | Level 20

that works for your many variables as the below test confirms

 

 


%macro c;
%do i=1 %to 250;
%let xp&i=&i;
%end;
%let list=%str();
%do i=1 %to 250;
%put &&xp&i;
%let list=&list|&&xp&i;
%end;
%mend c;
%c

%put &list;
jhh197
Pyrite | Level 9

hi

 

I have tried this but I am getting like below  it started with a pipe

 

|2|3|1

 

thought it should be like this

 

2|3|1

 

Thank you

novinosrin
Tourmaline | Level 20

i assumed you would have done this simple adjustment

 

%put %substr(&list,2);

novinosrin
Tourmaline | Level 20

or you could even try extracting from macro dictionary

 


%let xp1 =2;

%let xp2 =3;

%let xp3 =1;
/*filter macro dictionary if name=:'XP'*/

data _null_;
do until(l);
set sashelp.vmacro(keep=name) end=l;
length temp $20;
if name=:'XP' then temp=catx('|',temp,cats('&',name));
if l then call symputx('list',temp);
end;
run;

%put list=&list;

 LOG:

 

978
979 %put list=&list;
list=2|3|1

jhh197
Pyrite | Level 9
Hi Novin,
Thank you so much for trying different ways for helping me

Thanks
Astounding
PROC Star

A simple change gets rid of the extra pipe:

 

%macro c;
%global list;
%local i;
%let list = &xp1; %do i=2 %to 250; %let list=&list|&&xp&i; %end; %mend c; %c %put &list;
novinosrin
Tourmaline | Level 20

wouldn't that miss xp1 value?

 

Edit: Sorry let me run and understand. My apologies

Astounding
PROC Star

I hate this editor.

 

No, the XP1 value is captured by the first %LET statement.

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 23 replies
  • 17198 views
  • 3 likes
  • 5 in conversation