1

我有一个包含 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;

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

谢谢,-亚历克斯

4

2 回答 2

5

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

编译的 SAS 宏是由出现在%macroand%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 宏参考,尤其是介绍部分。

于 2012-07-25T23:09:33.947 回答
0

要将程序转换为宏,请将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;
于 2012-07-26T06:37:41.977 回答