如何在没有特殊字符的情况下将字符串传递给宏sas

时间:2015-08-04 14:31:05

标签: sas sas-macro

我在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.);

我看到了一件奇怪的事情。我张贴图片是因为无法描述它。我想有特殊的字符。

Screenshot

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

在你的宏中我相信你只需要在这一行附近加上引号:

filename dirList pipe &cmd.;

现在,在宏观解决方案发生后,它正在将其视为:

filename dirList pipe ls --full-time;

...将ls部分作为文件名声明的参数处理。修复后,代码应显示为:

filename dirList pipe "&cmd";

然后将解决为:

filename dirList pipe "ls --full-time";