Just for fun -- this assumes that:
1) the total length of your input string variable does not exceed SAS limits (~32K-ish characters?).
2) the individual values within this string (e.g., 'green', 'red',...) can themselves be legal variable names and that case is consistent
%macro maxlen(vals);
%global maxlen unqvals;
%let vals=%cmpres(&vals);
%let nvals=%sysfunc(countW(&vals, ' '));
%let maxlen=0;
%let unqvals=;
%do i=1 %to &nvals;
%let val=%scan(&vals,&i,' ');
%let maxlen=%sysfunc(max(&maxlen, %length(&val)));
%if %sysfunc(prxmatch(/\b&val\b/i, &unqvals))=0 %then %let unqvals=&unqvals &val;;
%end;
%mend; *maxlen();
%let vals=
Blue
Red
Blue
Green
Green
Yellow
Green
Yellow
;
%maxlen(&vals);
%put &=maxlen;
%put &=unqvals;
data want;
vals=compbl("&vals");
length val $&maxlen &unqvals 3;
array u {*} &unqvals;
do i=1 to &nvals;
val=scan(vals,i,' ');
do j=1 to dim(u);
u[j]=(val=vname(u[j]));
end;
output;
end;
keep val &unqvals;
run;
proc print data=want; run;
... View more