如何在没有特殊字符的情况下将字符串传递给宏 sas
how to pass a string to a macro sas without special char
我在 sas 中写了这个宏来获得一些关于一些文件的信息:
%macro info_1(cmd);
filename dirList pipe &cmd.;
data work.dirList;
infile dirList length=reclen;
input file $varying200. reclen;
permission=scan(file,1,"");
if input(scan(file,2,""), 8.)=1;
user=scan(file,3,"");
group=scan(file,4,"");
file_size_KB=round(input(scan(file,5,""), 8.)/1024,1);
file_size_MB=round(input(scan(file,5,""), 8.)/1024/1024,1);
modified_time=input(catx(" ",scan(file,6," "),scan(file,7,"")),anydtdtm.);
date_mod = datepart(modified_time);
time_zone=scan(file,8,"");
file_name=scan(file,-1,"");
format modified_time datetime19.;
format file_size_MB comma9.;
format date_mod date9.;
run;
%mend info_1;
然后我声明这个宏变量:
%let cmd = ls --full-time;
%let sep1= %quote( );
%let path = /data/projects/flat_file/meteo ;
%let file = *.json ;
%let sep2 = %quote(/) ;
%let fullpath = &cmd.&sep1.&path.&sep2.&file;
然后我尝试执行宏:
%info_1(&fullpath.);
我看到一件奇怪的事。我 post 一张图片,因为无法描述它。我猜有特殊字符。
如何解决这个问题?
在您的宏中,我相信您只需要在这一行周围添加引号:
filename dirList pipe &cmd.;
现在,在宏解析发生后,它的处理方式如下:
filename dirList pipe ls --full-time;
... 将 ls
部分向前处理为文件名语句的参数。修复后,代码应显示为:
filename dirList pipe "&cmd";
然后将解析为:
filename dirList pipe "ls --full-time";
我在 sas 中写了这个宏来获得一些关于一些文件的信息:
%macro info_1(cmd);
filename dirList pipe &cmd.;
data work.dirList;
infile dirList length=reclen;
input file $varying200. reclen;
permission=scan(file,1,"");
if input(scan(file,2,""), 8.)=1;
user=scan(file,3,"");
group=scan(file,4,"");
file_size_KB=round(input(scan(file,5,""), 8.)/1024,1);
file_size_MB=round(input(scan(file,5,""), 8.)/1024/1024,1);
modified_time=input(catx(" ",scan(file,6," "),scan(file,7,"")),anydtdtm.);
date_mod = datepart(modified_time);
time_zone=scan(file,8,"");
file_name=scan(file,-1,"");
format modified_time datetime19.;
format file_size_MB comma9.;
format date_mod date9.;
run;
%mend info_1;
然后我声明这个宏变量:
%let cmd = ls --full-time;
%let sep1= %quote( );
%let path = /data/projects/flat_file/meteo ;
%let file = *.json ;
%let sep2 = %quote(/) ;
%let fullpath = &cmd.&sep1.&path.&sep2.&file;
然后我尝试执行宏:
%info_1(&fullpath.);
我看到一件奇怪的事。我 post 一张图片,因为无法描述它。我猜有特殊字符。
如何解决这个问题?
在您的宏中,我相信您只需要在这一行周围添加引号:
filename dirList pipe &cmd.;
现在,在宏解析发生后,它的处理方式如下:
filename dirList pipe ls --full-time;
... 将 ls
部分向前处理为文件名语句的参数。修复后,代码应显示为:
filename dirList pipe "&cmd";
然后将解析为:
filename dirList pipe "ls --full-time";