在SAS中使用infile作为固定宽度文件时,如果遇到空行,如何停止输入?

时间:2015-11-27 04:08:10

标签: file-io sas

想象一下,您有一个特定的固定宽度文件,其中包含您感兴趣的数据行,一些空行,然后是您不感兴趣的一堆数据和说明。您如何读取该文件但停止在空白处?

例如,如果您下载并解压缩以下文档:

http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_TXT.zip

尝试读取SAS中的数据

data FF;
    infile 'C:/Data/F-F_Research_Data_Factors.txt' firstobs=5 stopover;
    input date Mkt_RF SMB HML RF;
run;

它读取底部附近的“额外”行,这些行不是月度数据,而是年度数据。有没有办法停在空白处?

3 个答案:

答案 0 :(得分:2)

对于像示例这样的简单文件,只需使用条件STOP语句。另请注意,您可以将这些YYYYMM值读取为实际日期值,而不是将它们视为数字。

data FF;
  infile 'C:/Data/F-F_Research_Data_Factors.txt' firstobs=5 truncover;
  input date Mkt_RF SMB HML RF;
  informat date yymmn6.;
  format date yymmn6.;
  if date=. then stop;
run;

答案 1 :(得分:1)

以下代码未经测试,但应该执行您希望实现的目标。

DATA FF;
INFILE 'C:/F-F_RESEARCH_DATA_FACTORS.TXT' FIRSTOBS=5 TERMSTR = CRLF;

/*READ IN ONLY VARIABLE DATE AND EVALUATE CONTENTS.*/

INPUT DATE @;

/*IF THERE IS A BLANK LINE THEN STOP READING IN THE FILE*/

IF DATE = . THEN STOP;

/*IF THE VALUE IS NOT MISSING THEN READ IN THE REMAINING COLUMNS*/

ELSE INPUT MKT_RF SMB HML RF;

RUN;

答案 2 :(得分:0)

我建议您在尝试使用类似以下内容解析行之前测试每一行。

data FF;
    infile 'C:/Data/F-F_Research_Data_Factors.txt' firstobs=5 stopover;
    input @;
    if _infile_='' then stop;
    input @1 date Mkt_RF SMB HML RF;
run;

input @;语句读取整行,但由于尾随@而未释放该行。 _infile_变量由输入语句自动加载整行。然后我们测试该行为空白。然后,原始输入语句需要@1将行读取指针重置为第一列,以便它可以正常运行。