This DATA step increments the value of N each time that it reads the
last occurrence of a data set name (when IF LAST.MEMNAME is true). The CALL
SYMPUT statement uses the current value of N to create a macro variable for
each unique value of MEMNAME in the data set TEMP1. The TRIM function removes
extra blanks in the TITLE statement in the PROC PRINT step that follows.
data _null_;
set &worklib..temp1 end=final;
by memname notsorted;
if last.memname;
n+1;
call symput('ds'||left(put(n,8.)),trim(memname));