只要没有从外部文件读取匹配的输入,INFILE就会停止数据步骤

时间:2019-02-15 15:11:07

标签: sas

当我的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将不会被读取。

我可以知道为什么吗?

谢谢!

2 个答案:

答案 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;

运行;