data A(keep=y) B(keep=x) C(keep=z);
x=1;
y=2;
Z=3;
run;
title 'A';
proc print data = A;
run;
title 'B';
proc print data = B;
run;
title 'C';
proc print data = C;
run;
above is my code, if I want to print data set A , data set B, data set C , I need to input the 'proc step' three times ? Is there one method which can print all the three data sets using one proc step?
Repeating code is the domain of the macro processor. Wrap your PRINT code into a macro:
%macro myprint(ds);
title "&ds.";
proc print data = &ds.;
run;
%mend;
and call the macro repeatedly:
%myprint(A)
%myprint(B)
%myprint(C)
and if you want to further autoamte that, use a dataset and CALL EXECUTE:
data control;
input ds $;
datalines;
A
B
C
;
data _null_;
set control;
call execute(cats('%nrstr(%myprint(',ds,'))'));
run;
The %NRSTR might be needed if you have macro code in the macro, to prevent premature resolution of such.
Repeating code is the domain of the macro processor. Wrap your PRINT code into a macro:
%macro myprint(ds);
title "&ds.";
proc print data = &ds.;
run;
%mend;
and call the macro repeatedly:
%myprint(A)
%myprint(B)
%myprint(C)
and if you want to further autoamte that, use a dataset and CALL EXECUTE:
data control;
input ds $;
datalines;
A
B
C
;
data _null_;
set control;
call execute(cats('%nrstr(%myprint(',ds,'))'));
run;
The %NRSTR might be needed if you have macro code in the macro, to prevent premature resolution of such.
Thank you for your help.
There's always another way in SAS.
The code below creates a macro (multiPrint) that accepts a parameter (dslist that contains your list of datasets). The macro then determines the number of datasets, and runs PROC PRINT on each dataset.
I added %put statements to help see what happens, you will probably also want to uncomment the options statement to get further debugging information, to help understand what happens.
/* options mprint mlogic symbolgen ; */
%macro multiPrint(dslist) ;
%let dsCnt=%sysfunc(countw("&dslist")) ;
%put dsCnt: &dsCnt ;
%do i=1 %to &dsCnt ;
%let dsname=%scan(&dslist,&i) ;
%put &i dsname= &dsname ;
title "&dsname" ;
proc print data=&dsname ;
run ;
%end ;
%mend ;
data A(keep=y) Bb(keep=x) ccC(keep=z);
x=1;
y=2;
Z=3;
run;
%multiPrint(a bb ccc) ;
Thanks a lot.
@tianerhu wrote:
data A(keep=y) B(keep=x) C(keep=z); x=1; y=2; Z=3; run; title 'A'; proc print data = A; run; title 'B'; proc print data = B; run; title 'C'; proc print data = C; run;
above is my code, if I want to print data set A , data set B, data set C , I need to input the 'proc step' three times ? Is there one method which can print all the three data sets using one proc step?
Basically no. Proc Print handles one data set at a time.
If the data is structured a bit differently you may be able to combine data sets and create separate output tables for each set using BY processing.
data one; input x y; datalines; 1 11 ; data two; input x y; datalines; 22 222 ; data three; input x y; datalines; 333 3333 ; data combined; set one two three indsname=dsname; source=dsname; run; proc print data=combined; by notsorted source; run;
The key bits here are the SET statement option INDSNAME in the data step creating combined. It creates a temproary variable holding the name of the data set that contributes each record. The Source=dsname makes a permanent variable in the output data set.
Then the BY in proc print creates a separate output table for each contributing data set. The NOTSORTED option on the BY statement tells SAS the Source variable is not in sorted order so the default behavior of BY group processing causing an error if not sorted BY the values is encountered does not create an error.
This may not do what you want if YOUR data sets have radically different variables because the combined data set would have all the variables and could result in lots of missing values if the specific variables were not that Source data set. Which would be so ugly that the whole process would be questionable in general.
Another approach is to use the macro language to create a loop based on the names which basically calls proc print multiple times.
%macro dummy(namelist=); %do i = 1 %to %sysfunc(countw(&namelist.,,s )); %let name= %scan(&namelist.,&i,,s ); proc print data=&name.; run; %end; %mend; %dummy(namelist= one two three)
Caution: typos or logic errors in macro coding can place a SAS session into an unstable state and appear to quit working.
Thank you, I appreciate.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.