有条件地读取 DATA INPUT 列语句

Read DATA INPUT column statement conditionally

我对 SAS 比较陌生(如果需要的话,我会使用 SAS EG)。

我有几个以前编写的程序可以读取新的数据文件。对于每种类型的数据文件,都有一个 单独的 程序及其特定的 INPUT 列语句。

例如,一个程序将具有:

DATA data1;
   INFILE 'D:\file.txt' noprint missover;
INPUT
ID      1 - 8
NAME  $ 9 - 20;
run;

而另一个程序会有其他定义。例如:

INPUT
ID      1 - 5
NAME  $ 6 - 20

每个数据文件包含数百个变量,因此每个程序中的INPUT 列语句很长。但是,这些程序的其余部分完全相同。

我打算把这些程序合二为一,

我有两个问题:

  1. 是否可以将这些程序与条件 INPUT 列 语句结合起来?

  2. 是否可以从变量中读取每个文件类型列的定义? (这样我就可以在工作流程的其他地方定义它,甚至可以从外部文件中读取它)

您似乎使用了具有固定宽度定义的文本文件。对于这些,您可以分别指定格式文件

column, type, start, end

然后先读取该文件以构建 INPUT 语句。 column 是列名,type n(数字)或 c(字符)之一,startend 开始和结束位置对于此专栏。

你可以像这样将其包装成 MACRO

%macro readFile(file, output);
  %local input_statement;
  /* First, read the format file that contains the column details. */
  data _null_;
    infile "&file..fmt" dlm="," end=eof;
    input column $ type $ start end;
    length input_statement $ 32767;
    retain input_statement "input";
    if type = "c" then type = "$";
    else type = "";
    input_statement = catx(" ", input_statement, column, type, start, "-", end);
    if eof then call symputx("input_statement", input_statement);
  run;

  /* Read the actual file. */
  data &output.;
    infile "&file.";
    &input_statement.;
  run;

%mend;

对于文件 file.txt,宏需要在同一路径中命名格式文件 file.txt.fmt。将宏调用为

%readFile(%str(D:\file.txt), data1);