我尝试创建一个带有文本文件的程序,替换其中的所有宏引用,并将其附加到单个输出文件中。当我迭代数据集中的观察值时生成宏引用。
我在尝试让它读取源表中每个观察的整个文本文件时遇到了麻烦。我认为有一条隐含的stop
指令与我在end=
语句中使用infile
选项有关,该选项阻止我的set语句迭代每条记录。
我已经简化了模板和代码,示例如下:
以下是我尝试填充的模板:
INSERT INTO some_table (name,age)
VALUES (&name,&age);
这是SAS代码:
filename dest "%sysfunc(pathname(work))\backfill.sql";
data _null_;
attrib line length=$1000;
set sashelp.class;
file dest;
infile "sql_template.sas" end=template_eof;
call symput('name', quote(cats(name)));
call symput('age' , cats(age));
do while (not template_eof);
input;
line = resolve(_infile_);
put line;
end;
run;
运行上面的代码会生成所需的输出文件,但仅适用于数据集中的第一次观察。
答案 0 :(得分:2)
你不能这样做,因为在第一次观察之后你已经在输入文本文件的末尾了。所以你的DO WHILE
循环只运行第一次观察。
这是我很久以前在SAS-L上学到的一个技巧。在两个输入文件之间切换,以便您可以再次从输入文件的顶部开始。
首先,让我们创建您的示例模板程序和一个空虚拟文件。
filename template temp;
filename dummy temp;
data _null_;
file template;
put 'INSERT INTO some_table (name,age)'
/ ' VALUES (&name,&age)'
/ ';'
;
file dummy ;
run;
现在让我们编写一个数据步骤来读取输入数据并使用RESOLVE()
函数转换文本。
filename result temp;
data _null_;
length filename $256 ;
file result ;
set sashelp.class;
call symputx('name', catq('1at',name));
call symputx('age' , age);
do filename=pathname('template'),pathname('dummy');
infile in filevar=filename end=eof ;
do while (not eof);
input;
_infile_ = resolve(_infile_);
put _infile_;
end;
end;
run;
生成的文件如下所示:
INSERT INTO some_table (name,age)
VALUES ('Alfred',14)
;
INSERT INTO some_table (name,age)
VALUES ('Alice',13)
;
...