Macros sas宏索引还是其他?

Macros sas宏索引还是其他?,macros,indexing,sas,sas-macro,Macros,Indexing,Sas,Sas Macro,我有169个城镇,我想迭代一个宏。我需要使用城镇名称(而不是城镇代码)保存输出文件。我有一个带有城镇代码和城镇名称的数据集(城镇)。是否有可能在i=城镇代码的每次迭代中将%let语句设置为城镇名称 我知道我可以使用index函数列出城镇名称,但我想知道一种设置index函数的方法,以便它在I=town.town-code时为town.town-name设置%let语句 下面所有的答案似乎都是可能的。我现在已经使用了%let=%scan(,&I)选项。一个限制是城镇名称可以不止一个单词,所以我用

我有169个城镇,我想迭代一个宏。我需要使用城镇名称(而不是城镇代码)保存输出文件。我有一个带有城镇代码和城镇名称的数据集(
城镇
)。是否有可能在i=城镇代码的每次迭代中将
%let
语句设置为城镇名称

我知道我可以使用index函数列出城镇名称,但我想知道一种设置index函数的方法,以便它在I=town.town-code时为town.town-name设置
%let
语句


下面所有的答案似乎都是可能的。我现在已经使用了%let=%scan(,&I)选项。一个限制是城镇名称可以不止一个单词,所以我用下划线代替空格,稍后我会更正

这是我的宏。我将169个城镇的过程报告输出到excel。我需要将excel文件保存为城镇名称,并在标题中包含城镇名称。然后,在excel中,我将所有169个工作表合并到一个工作簿中

%MACRO BY_YEAR;

    %let townname=Andover Ansonia Ashford Avon ... Woodbury Woodstock;

    %do i = 1999 %to 2006;

    %do j = 1 %to 169;

    %let name = %scan(&townname,&j); 

    ods tagsets.msoffice2k file="&ASR.\Town_Annual\&i.\&name..xls" style=minimal;


    proc report data=ASR nofs nowd split='/';
    where YR=&i and TWNRES=&j;
      column CODNUM AGENUM  SEX,(dths_sum asr_sum seasr_sum);
      define CODNUM / group     ;
      define agenum / group     ;
      define sex / across ;
      define dths_sum / analysis ;
      define asr_sum / analysis ;
      define seasr_sum / analysis ;
      break after CODNUM / ul;
      TITLE1 "&name Resident Age-Specific Mortality Rates by Sex, &i";
      TITLE2 "per 100,000 population for selected causes of death";
    run;

    ods html close;

    %end;

    %end;

%MEND;

我的猜测是,您希望按城镇索引查找城镇名称的原因是重复调用每个城镇名称的宏。如果是这样的话,那么你甚至不需要参与城镇指数业务。只需使用每个城镇的名称调用宏即可。有很多方法可以做到这一点。下面是使用
调用execute()
的一种方法

如果确实需要进行表格查找,那么一种方法是将城镇名称转换为数字格式,并在给定索引值的情况下编写一个简单的宏来检索名称。比如:

data towns;
  infile cards dlm=",";
  input town :$char10. @@;
cards;
My Town,Your Town,His Town,Her Town
;
run;

/* make a numeric format */
data townfmt;
  set towns end=end;
  start = _n_;
  rename town = label;
  retain fmtname 'townfmt' type 'n';
run;
proc format cntlin=townfmt;
run; 

%macro town(index);
  %trim(%sysfunc(putn(&index,townfmt)))
%mend town;

%*-- check --*;
%put %town(1),%town(2),%town(3),%town(4);
/* on log
My Town,Your Town,His Town,Her Town
*/

或者把代码和名称作为参数传递给宏?像这样

%MACRO DOSTUFF(CODE=, NAME=);
DO STUFF...;
PROC EXPORT DATA=XYZ OUTFILE="&NAME."; RUN;
%MEND;

DATA _NULL_;
SET TOWNS;
CALL EXECUTE("%DOSTUFF(CODE=" || STRIP(CODE) || ", NAME=" || STRIP(NAME) || ");");
RUN;

不确定你的问题是否得到了回答。让我知道,如果我能进一步帮助您,更多的数据示例将允许我们提供更多的见解。
%MACRO DOSTUFF(CODE=, NAME=);
DO STUFF...;
PROC EXPORT DATA=XYZ OUTFILE="&NAME."; RUN;
%MEND;

DATA _NULL_;
SET TOWNS;
CALL EXECUTE("%DOSTUFF(CODE=" || STRIP(CODE) || ", NAME=" || STRIP(NAME) || ");");
RUN;