2009-09-17 74 views
2

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

我知道我可以使用索引函数列出城镇名称,但我想设置索引函数的方法,以便在i = 1时设置%let语句到TOWN.town-名称。 TOWN.town代码。


以下所有答案似乎都是可能的。我现在已经使用%let =%扫描(,& i)选项。一个限制是城镇名称可以多于一个单词,所以我用下划线代替了我稍后修正的空格。

这是我的宏。我输出了proc报告,为169个城镇中的每一个城市都表现出色。我需要将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;

+0

不确定您的问题是否得到解答。让我知道如果我可以进一步帮助你,更多的数据示例可以让我们提供更多的见解。 – AFHood 2009-09-24 11:54:40

回答

2

我的猜测是,你想按城镇指数查找城镇名称的原因是反复调用每个城镇名称的宏。如果是这种情况,那么你甚至不需要参与城镇指数业务。只需用每个城镇名称来调用宏。有很多方法可以做到这一点。这是使用call execute()的一种方法。

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

%macro doTown(town=); 
    %put Town is &town..; 
%mend doTown; 

/* call the macro for each town */ 
data _null_; 
    set towns; 
    m = catx(town, '%doTown(town=', ')'); 
    call execute(m); 
run; 

/* on log 
Town is My Town. 
Town is Your Town. 
Town is His Town. 
Town is Her Town. 
*/ 

如果你需要做一个查表,再一个办法是到你的城市名称中所给出的指数值转换成数字格式,写一个简单的宏来检索名称。例如:

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 
*/ 
0

或者您如何将代码和名称作为参数传递给宏?喜欢这个?

%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;