有条件地读取 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 列语句很长。但是,这些程序的其余部分完全相同。
我打算把这些程序合二为一,
我有两个问题:
是否可以将这些程序与条件 INPUT 列 语句结合起来?
是否可以从变量中读取每个文件类型列的定义? (这样我就可以在工作流程的其他地方定义它,甚至可以从外部文件中读取它)
您似乎使用了具有固定宽度定义的文本文件。对于这些,您可以分别指定格式文件
column, type, start, end
然后先读取该文件以构建 INPUT
语句。 column
是列名,type
n
(数字)或 c
(字符)之一,start
和 end
开始和结束位置对于此专栏。
你可以像这样将其包装成 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);
我对 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 列语句很长。但是,这些程序的其余部分完全相同。
我打算把这些程序合二为一,
我有两个问题:
是否可以将这些程序与条件 INPUT 列 语句结合起来?
是否可以从变量中读取每个文件类型列的定义? (这样我就可以在工作流程的其他地方定义它,甚至可以从外部文件中读取它)
您似乎使用了具有固定宽度定义的文本文件。对于这些,您可以分别指定格式文件
column, type, start, end
然后先读取该文件以构建 INPUT
语句。 column
是列名,type
n
(数字)或 c
(字符)之一,start
和 end
开始和结束位置对于此专栏。
你可以像这样将其包装成 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);