如何将多个未格式化的数据文件导入 SAS,同时跳过每个文件的多行?

  • 本文关键字:文件 SAS 格式化 数据 导入 sas
  • 更新时间 :
  • 英文 :


我正在尝试使用'*.xle'通配符将单个文件夹中的多个未格式化数据文件导入 SAS 数据集,同时跳过每个文件的前 47 行。 SAS 将对第一个文件使用该'firstobs=48',但将忽略每个后续文件,并从第 1 行开始读取。我已经按照其他多个 Stackoverflow 线程的建议使用eov=0设置了代码,但它似乎仍然不起作用。任何帮助都非常感谢。请参阅下面的代码:

data test;
infile "*.xle" eov=eov firstobs=48;
input @;
if eov then input;
input Date $ 19-28 / Time $ 19-26 // Data 18-24 / Temp 18-22 //;
eov=0;
run;

您非常接近,当您开始一个新文件 EOV=1 时,您需要输入 47 次。

或者,您可以使用 FILEVAR 和 FIRSTOBS 将适用于每个文件,但这需要生成一个文件名列表以用于驱动数据步骤。 可以说是六打对六打。

filename FT15F001 '.a.xle';
parmcards;
a line 1
a line 2
a line 3
a line 4
;;;;
filename FT15F001 '.b.xle';
parmcards;
b line 1
b line 2
b line 3
b line 4
;;;;
filename FT15F001 '.c.xle';
parmcards;
c line 1
c line 2
c line 3
c line 4
;;;;

data test;
infile "*.xle" eov=eov firstobs=3 length=l;
input @;
if eov then do;
do _n_ = 1 to 2; input; end;
eov=0;
end;
input line $varying40. l; 
list;
run;
proc print;
run;

可以使用 EOV= 选项创建的变量,但我发现只使用 FILENAME= 然后使用 LAG() 函数来检测新文件何时启动更容易。

要跳过 48 行,您可以执行多个 INPUT 语句或向一个 INPUT 语句添加多个/字符。

data test;
length fname $256 ;
infile "*.xle" filename=fname ;
input @;
if fname ne lag(fname) then do;
input %sysfunc(repeat(/,48-1));
end;
input Date $ 19-28 / Time $ 19-26 // Data 18-24 / Temp 18-22 //;
run;

请注意,如果任何文件实际上比预期的短,那么您需要在跳过步骤和读取步骤中更加小心。否则,当您在一个 INPUT 语句中读取多行时,您可能会读取一个文件的末尾并开始读取下一个文件的行。

最好先获取文件列表,然后将其与 FILEVAR= 选项一起使用来驱动该过程。然后,INFILE 为每个文件单独执行,您可以使用 FIRSTOBS= 选项。 然后,您需要添加一个循环来读取和输出文本文件中的观测值。这样,数据步骤的每次迭代将处理一个完整的文件。

data files;
infile "ls *.xle" pipe truncover ;
input filename $256.;
run;
data test;
set files ;
fname=filename ;
infile dummy filevar=fname firstobs=48 end=eof;
do while (not eof);
input Date $ 19-28 / Time $ 19-26 // Data 18-24 / Temp 18-22 //;
output;
end;
run;

但是,在一个 INPUT 语句中读取多行同样是危险的,您应该更改读取这些行的代码以逐个读取它们,并检查您是否尚未读取文件末尾。 请记住,如果 INPUT 语句(或 SET 语句)读取超过输入流的末尾,SAS 将停止整个数据步骤。

最新更新