%let TableList = TableA TableH TableB TableG;
&TableList
中的字词由' '
分隔。
如何检索某些字词以执行以下操作?
我不知道tablelist
中的单词数量,并希望从列表中获取第n个单词。
给定i = 4
,
data &&table&i.; /* &&table&i. will resolve to TableG */
set have;
[..];
run;
答案 0 :(得分:2)
我会和@mjsqu做同样的%sysfunc(scan)
伎俩并回答你剩下的问题 - 得到最后一句话因为你不知道列表中的单词数量,这是最简单的方法我可以想到正在使用array
,如下所示
%let all=word1 word2 word3 word4 word5;
%macro test;
data _NULL_;
array x[*] &all.;
Num=dim(x);
call symput("Num_of_words",num);
run;
%mend;
%test;
现在你知道了单词的总数,所以也可以找到最后一个单词。
答案 1 :(得分:1)
简短的回答是使用%scan
功能:
%put %scan(&tablelist,4,%str( ));
第三个参数指定%scan
应仅将空格计为分隔符。否则,默认情况下,它还会将以下所有字符视为分隔符:
. < ( + & ! $ * ) ; ^ - / , % |
根据您的列表,您可以使用%do
循环将宏变量添加到列表中:
/* initialise a counter macro variable */
%let k = 1;
/* iterate through tablelist until a value is not found */
%do %until (%scan(&tablelist,&k,%str( )) = );
%let table&k = %scan(&tablelist,&k,%str( ));
%let k = &k + 1;
%end;
%let i = 4;
%put &&table&i;
N.B。此代码仅适用于宏定义(即由%macro
和%mend
语句分隔的代码块。
答案 2 :(得分:0)
如果您为了从列表中选择一个单词而进行此操作,您应该只创建一个宏,而不是尝试设置宏变量。完成所有业务以制作各种宏变量与单行宏相比,需要做太多额外的工作。
{{1}}