逐行读取数据集

时间:2016-06-14 21:09:20

标签: sas

我尝试创建一个带有文本文件的程序,替换其中的所有宏引用,并将其附加到单个输出文件中。当我迭代数据集中的观察值时生成宏引用。

我在尝试让它读取源表中每个观察的整个文本文件时遇到了麻烦。我认为有一条隐含的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;

运行上面的代码会生成所需的输出文件,但仅适用于数据集中的第一次观察。

1 个答案:

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