SAS宏做循环 - 导入多个平面文件

时间:2012-07-25 20:58:34

标签: import macros sas sas-macro

我有一个包含17个平面文件的列表,我正在尝试将其导入到不同的数据集中。所有文件都有相同的数据步骤,所以我正在尝试编写一个do while循环来导入所有文件。

我一直试图从这里调整一些代码而没有成功: http://www.sas.com/offices/europe/uk/support/sas-hints-tips/tips-enterprise-csv.html

http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000543785.htm

我收到的错误是%do statement is not valid in open code。这是我的代码:

% let path1 = 'c:\path1'
% let path2 = 'c:\path2'
...
% let pathN = 'c:\pathN' 

%let n=1; 

%do %while (&n <= 17);
%let pathin = &path&n;

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%let n=%eval(&n+1); 
%end;

我已经在do-while循环之外测试了数据步骤,并且使用%let pathin = &path&n代码一次可以正常处理1个文件。代码仍然为第一个数据集写入数据文件;但是,我需要能够遍历所有文件,无法弄清楚如何。对不起,如果这是一个新手问题;我刚刚学习SAS。

谢谢, -Alex

2 个答案:

答案 0 :(得分:5)

欢迎使用SAS编程!你得到的错误信息是一个线索。 “开放代码”是指由SAS系统直接执行的语句。 %do声明是 SAS宏语言的一部分,而不是“普通”SAS。 %let语句可以在开放代码中执行,用于创建macro variable(与已编译的宏不同)。

编译的SAS宏是由%macro%mend语句之间出现的代码创建的。例如,使用您的代码:

%macro run_me;
%let n=1; 

%do %while (&n <= 17);
%let pathin = &path&n;

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%let n=%eval(&n+1); 
%end;
%mend;

但所有这一切都是定义/编译宏。要执行它,您必须发出语句%run_me;。请注意,名称run_me只是我编写的名称。

有关详细信息,请参阅SAS Macro Reference,尤其是介绍部分。

答案 1 :(得分:0)

要将您的progma转换为宏,请将LET语句声明的宏变量转换为宏参数:

%macro readfile(n, pathin);

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%mend;

重复调用宏的数据步骤。 这里的数据包含在CARDS语句中,但也可以通过SET语句从某些表中读取。 宏调用是通过call execute例程执行的。

data _null_;
length path $200 stmt $250;
input path;
stmt = catt('%readfile(', putn(_N_, 3. -L), path, ')');
call execute(stmt);

cards;
c:\file1.txt
c:\file2.txt
c:\file3.txt
;
run;