使用M修饰符%SCAN给出错误的结果

时间:2019-04-17 05:08:36

标签: sas

任何人都可以建议以下两个代码为何具有不同的输出吗?

我有一个宏var FILETYPE,它解析为,File //缺少第一个值。

%let b=%scan("&filetype",1,",",M);
%put &b;
%let c=%scan("&filetype",2,",",M);
%put &c;
%let d=%scan("&filetype",3,",",M);
%put &d;
%mend;
%tt;`

我得到以下输出:

SYMBOLGEN:  Macro variable FILETYPE resolves to ,File
SYMBOLGEN:  Macro variable B resolves to 

SYMBOLGEN:  Macro variable FILETYPE resolves to ,File
SYMBOLGEN:  Macro variable C resolves to 

SYMBOLGEN:  Macro variable FILETYPE resolves to ,File
SYMBOLGEN:  Macro variable D resolves to File
File

当宏var C应该已解析为File,但其仍为NULL且D获得值File时。

普通数据步骤中的相同逻辑正常工作。

data a;
b=scan("&filetype",1,',','M');
c=scan("&filetype",2,',','M');
run;
Output :
b=blank
c=File

有人可以建议带有M修饰符的SCAN函数如何在数据步骤中正常运行,而不在宏中正常运行吗?

2 个答案:

答案 0 :(得分:2)

它在宏代码中的作用与在数据步骤代码中的作用完全相同。问题是您在要扫描的字符串和要使用的定界符列表中都添加了双引号。因此,等效的数据步骤为:

%let filetype=A,B;
data _null_;
  length string word $100;
  string=quote(symget('filetype'));
  do i=1 to 4;
    word=scan(string,i,'","','M');
    put i= word=:$quote.;
  end;
run;

哪个会产生以下结果:

i=1 word=""
i=2 word="A"
i=3 word="B"
i=4 word=""

您可能打算在宏代码中执行的操作是:

%scan(%superq(filetype),1,%str(,),M)

在普通的SAS代码中,您需要在字符串文字周围添加引号,以便解析器知道您的意思不是变量名。在不需要的宏代码中,所有内容都是字符串。您可以使用&%宏触发器来使解析器知道何时将其区别对待。

在生成要在宏代码中使用的定界列表时,请使用不同的定界符来生成它,并避免处理逗号所需的所有宏引号。

... into :filetype separated by '|' ...
%scan(&filetype,1,|,m)

答案 1 :(得分:1)

不要在宏调用中双引号。您确实需要将逗号值的参数文字化为%str(,),以使其不被视为参数分隔符。

%scan ( &filetype , 1, %str(,), M )

如果文件类型值包含宏重要符号,则可能必须宏引用或替换参数。如果返回值中包含无法解析的宏重要符号,则需要使用%QSCAN对其进行屏蔽。