First of all , you need to know the top Master .
Here I made a table to contain it.
data ancient;
set have;
if _start=_end;
run;
After that the following code could give you a start.
data temp;
infile cards expandtabs ;
input client $ Masterclient_1 $ Masterclient_2 $ Masterclient_3 $;
cards;
a a . .
b a b .
c . . e
d . b .
e . . e
;
run;
data have;
set temp;
array x{*} $ Masterclient: ;
_end=client;
do i=1 to dim(x);
if not missing(x{i}) then do;_start=x{i};output; end;
end;
keep _start _end;
run;
data ancient;
set have;
if _start=_end;
run;
data want(keep=path);
if _n_ eq 1 then do;
length path _path $ 400 ;
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 ancient;
count=1;n=1;_n=1;
path=catx('|',_start,_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;
count+1;n=count;
path=catx('|',path,_end);
pa.add();
path=_path;
end;
rc=ha.find_next();
end;
end;
pa.clear();
run;
data want;
set want;
start=scan(path,1,'|');
end=scan(path,-1,'|');
count=countw(path,'|')-1;
run;
... View more