OK. Here is . I change the code a little bit just for case of LOOP ,if you have it.
proc import datafile='c:\temp\test_base.txt' out=have(rename=(start=_start end=_end)) replace dbms=tab;
run;
proc sql;
create table x as
select distinct _start,_end
from have
where _start not in (select distinct _end from have);
quit;
data want(keep=path);
if _n_ eq 1 then do;
length path _path $ 800 ;
if 0 then set have;
declare hash ha(hashexp:20,dataset:'have(where=(_start is not missing and _end is not missing))',multidata:'y');
ha.definekey('_start');
ha.definedata('_end');
ha.definedone();
declare hash pa(ordered:'y');
declare hiter hi_path('pa');
pa.definekey('n');
pa.definedata('n','path');
pa.definedone();
end;
set x;
count=1;n=1;_n=1;
path=catx('|',_start,_end);
*putlog 'WARNING:Found ' _end;
pa.add();
do while(hi_path.next()=0);
if n ne 1 then pa.remove(key:_n);_n=n;
_path=path;
_start=scan(path,-1,'|');
rc=ha.find(); if rc ne 0 then output;
do while(rc=0);
if not findw(path,strip(_end),'|') then do;
if length(path)+length(_end)+1 gt lengthc(path) then do;
putlog 'ERROR: The length of path and _path are set too short';
stop;
end;
*putlog 'WARNING:Found ' _end;
count+1;n=count;
path=catx('|',path,_end);
pa.add();
path=_path;
end; else output; /* <--Changed. It is a circle.*/
rc=ha.find_next();
end;
end;
pa.clear();
run;
proc sql noprint;
select max(countw(path,'|')) into : n separated by ' '
from want;
quit;
data final_want;
set want;
array col{*} $ 100 col1-col&n;
do i=1 to countw(path,'|');
col{i}=scan(path,i,'|');
end;
drop i;
run;
... View more