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