在宏变量列表中获取第i个单词

时间:2015-05-20 09:09:22

标签: macros sas

%let TableList = TableA TableH TableB TableG;

&TableList中的字词由' '分隔。

如何检索某些字词以执行以下操作?

我不知道tablelist中的单词数量,并希望从列表中获取第n个单词。

给定i = 4

data &&table&i.; /* &&table&i. will resolve to TableG */
set have;
[..];
run;

3 个答案:

答案 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}}