Вы слишком усложнили задачу генерации кода. Вам просто нужно сгенерировать оператор put, например:
put name ~ sex ~ age height weight ;
Так что создайте макропеременные, чтобы помочь с этим. Вы также можете сделать информацию, необходимую для заголовков. Я предполагаю, что вы также хотите кавычки вокруг значений заголовка. Включите VARNUM в список выбора, чтобы избежать предупреждения PRO C SQL о сортировке по невыбранному значению.
proc sql noprint;
select varnum
, quote(trim(name))
, catx(' ',name,case when (type=2) then '~' else ' ' end)
into :dummy
, :headers separated by '|'
, :varlist separated by ' '
from vars
order by varnum
;
quit;
Тогда ваш шаг для записи данных будет следующим:
data _null_;
set &lib..&dset;
file "&outPath\&lib..&dset..txt" lrecl=2000000 dsd dlm='|';
if _n_=1 then put %sysfunc(quote(&headers),%str(%')) ;
put &varlist;
run;