当我的INFILE命令没有从外部文件源返回匹配值时,我的数据步骤停止。为什么会这样?
我有具有以下值的work._input数据集:
fname
cus_01.txt
cus_02.txt
cus_03.txt
以下是每个外部文本文件的值:
cus_01.txt:
ID: 0001
Firstname: John
Lastname: White
cus_02.txt:
This is just a dummy/empty dataset
cus_03.txt:
ID: 0002
Firstname: Mike
Lastname: Harrel
代码:
%let sPath = /root/documents/files;
data work._output;
set work._input;
length firstname lastname path f2r $512. fname $32.;
path = symget('sPath');
f2r = catx("/", path, fname);
infile a filevar=f2r;
input @'Firstname:' firstname $;
input @'Lastname:' lastname $;
output work._output;
run;
输出:
数据步骤的第一次迭代将是以下值:
Firstname Lastname fname
John White cus_01.txt
但是,在数据步骤的第二次迭代中,在cus_02.txt文件中找不到匹配的“ Firstname”和“ Lastname”,这将导致数据步骤停止处理,因此,不会发生for的第三次迭代和cus_03.txt将不会被读取。
我可以知道为什么吗?
谢谢!
答案 0 :(得分:0)
您需要在输入上形成一个内部循环,以便从文件中读取所有行。循环需要一个终止条件,该条件将包含一个标志变量,该标志变量由infile
end=
选项自动管理并提供。
(未经测试)
data work._output;
set work._input;
length firstname lastname path f2r $512. fname $32.;
path = symget('sPath');
f2r = catx("/", path, fname);
file_end = 0; * reset just in case;
infile a filevar=f2r end=file_end;
do while (not file_end);
input @'Firstname:' firstname $;
input @'Lastname:' lastname $;
output work._output;
end;
run;
在没有内部循环的情况下,每次输入后,文件变量都会前进到set _input
提供的下一个文件名。
注意:这与INFILE "<wildcarded filename specification>"
的操作不同,后者不需要内部循环。
此外,当线对Firstname:
和Lastname:
不同步时(例如,当两者都不存在或另外一条数据线出现时,例如{{ 1}}))
答案 1 :(得分:0)
我已经找到了解决方法。
我添加了内部循环来处理对外部文件的所有观察,并使用名称匹配代替@'character-string'
向SAS社区的Tom发出S / O,以获取建议!
%let sPath = /root/documents/files;
data work._output;
set work._input;
length firstname lastname path f2r $512. fname $32.;
path = symget('sPath');
f2r = catx("/", path, fname);
infile a filevar=f2r dlm=":" end=eof truncover;
do while(not eof);
input Label $ value $;
if Label =: 'Firstname' then firstname = value;
if Label =: 'Lastname' then lastname = value;
end;
运行;