Макропроцессор будет искать макро-триггеры &
и %
внутри строк, заключенных в двойные кавычки, но не те, которые заключены в одинарные кавычки.Вы можете использовать функцию quote()
, чтобы заключить строку в одинарные кавычки.
%let cmd=find &directory/ -type f -printf '%s %p\n' ;
filename tmp pipe %sysfunc(quote(&cmd,%str(%')));
Или вы можете просто использовать код SAS и не допустить участия макропроцессора.
Вместо созданияоператор FILENAME, вы можете использовать шаг данных для вызова функции FILENAME()
.
data _null_;
rc=filename('TMP'
,catx(' ',"find &directory/ -type f -printf",quote('%s %p\n',"'"))
,'PIPE');
put rc= ;
run;
data all_files;
infile tmp truncover;
input size file_path $255. ;
run;
Или вы вообще не можете создать fileref и вместо этого просто использовать опцию FILEVAR=
в операторе INFILE
, чтобыпередать в команду.
data all_files;
length cmd $200;
cmd = catx(' ',"find &directory/ -type f -printf",quote('%s %p\n',"'"));
infile tmp pipe filevar=cmd truncover;
input size file_path $255. ;
run;
Примечание: изменение порядка размера и пути в строке printf позволит избежать проблем с анализом результатов при наличии имен файлов со встроенными пробелами.