Desktop productivity for business analysts and programmers

Performing a do loop over a list of values

Accepted Solution Solved
Reply
Contributor
Posts: 54
Accepted Solution

Performing a do loop over a list of values

Folks,

 

I'm following the steps in the above example to attempt to create a macro which will read over various values. However, I'm running into trouble.

 

https://blogs.sas.com/content/sastraining/2015/01/30/sas-authors-tip-getting-the-macro-language-to-p...

 

So I want my code to read in the following values (1e, 1f etc.)

 

And then spit out 7 new datasets where they would be called 

 

test1e , test1f, test1g etc. 

 

%macro px;

%let value = 1e 1f 1g 1h 1b 1a 1c;


%local i next_value;
%let i=1;
%do %while (%scan(&value, &i) ne );
   %let next_value = %scan(&value, &i);
   %let i = %eval(&i + 1);
%end;

   data test&value;
set table_&value;run;
%mend;

%px;

However, I'm running into the following issues.

 

NOTE: Line generated by the macro variable "VALUE".
44          test1e 1f 1g 1h 1b 1a 1c
                   _     _     _
                   22    22    22
                   200   200   200
                      _     _     _
                      22    22    22
                      200   200   200
SYMBOLGEN:  Macro variable VALUE resolves to 1e 1f 1g 1h 1b 1a 1c
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, /, ;, _DATA_, _LAST_, _NULL_.  

ERROR 200-322: The symbol is not recognized and will be ignored.

NOTE: Line generated by the macro variable "VALUE".
44          table_1e 1f 1g 1h 1b 1a 1c
                     _     _     _
                     22    22    22
                     200   200   200
                        _     _     _
                        22    22    22
                        200   200   200

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, -, :, ;, CUROBS, END, INDSNAME, KEY, 
              KEYRESET, KEYS, NOBS, OPEN, POINT, _DATA_, _LAST_, _NULL_.  

ERROR 200-322: The symbol is not recognized and will be ignored.

It doesn't seem to be looping over things correctly.

 

Any input would be great


Accepted Solutions
Solution
‎12-01-2017 10:41 AM
Super User
Posts: 6,543

Re: Performing a do loop over a list of values

Posted in reply to Sean_OConnor

&VALUE is constant.  &NEXT_VALUE is what changes each time through the loop.

 

Whatever it is you want to generate as a SAS program, it has to be inside the %DO loop, not outside.  And it should refer to &NEXT_VALUE instead of &VALUE.

View solution in original post


All Replies
Super User
Posts: 13,084

Re: Performing a do loop over a list of values

Posted in reply to Sean_OConnor

Why did you bother to create next_value if you weren't going to use it?

I think that is the macro variable you meant to use instead of value (which has 5 spaces in the middle) in the data step.

Solution
‎12-01-2017 10:41 AM
Super User
Posts: 6,543

Re: Performing a do loop over a list of values

Posted in reply to Sean_OConnor

&VALUE is constant.  &NEXT_VALUE is what changes each time through the loop.

 

Whatever it is you want to generate as a SAS program, it has to be inside the %DO loop, not outside.  And it should refer to &NEXT_VALUE instead of &VALUE.

Super User
Super User
Posts: 9,227

Re: Performing a do loop over a list of values

Posted in reply to Sean_OConnor

Look at what you macro code resolves to - remember macro does nothing but create base SAS code:

data test1e 1f 1g 1h 1b 1a 1c;
set table_1e 1f 1g 1h 1b 1a 1c;
run;

 

Does that look right to you?  Maybe you meant to use next_value.

 

Oh, and the usual word of warning, macro can be helpful in some select occasions, however it is not a replacement for base SAS.  If you find yourself doing loops and lists of values in macro, then 90% of the time you are doing something wrong.

Contributor
Posts: 25

Re: Performing a do loop over a list of values

Posted in reply to Sean_OConnor

Hi,

 

If I understand correctly what you're trying to do, your ordering of SAS statements is a bit off, and you use the original long string &VALUE as the dataset name. The %do loop ends without actually doing anything besides incrementing i and creating next_value macro variable. I assume for purposes of the example, the input dataset is exactly the same as the output dataset.

 

Try:

 

%macro px;

%let value = 1e 1f 1g 1h 1b 1a 1c;


%local i next_value;
%let i=1;
%do %while (%scan(&value, &i) ne );
   %let next_value = %scan(&value, &i);

   data test&next_value;
set table_&next_value;run;
%let i = %eval(&i + 1);

%end;

%mend;

%px;

 

☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 4 replies
  • 890 views
  • 0 likes
  • 5 in conversation