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

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

我正在尝试使用
'*.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行,您可以执行多个输入语句或向一个输入语句添加多个/字符

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;
请注意,如果任何文件实际上比预期的短,那么在跳过步骤和读取步骤中都需要更加小心。否则,当您在一条输入语句中读取多行时,您可以读取一个文件的末尾,然后开始从下一个文件中读取行

最好先获取文件列表,并将其与FILEVAR=选项一起使用,以驱动流程。然后对每个文件分别执行infle,您可以使用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;

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

您还查阅了哪些其他资源?请你相应地修改你的问题好吗?