想象一下,您有一个特定的固定宽度文件,其中包含您感兴趣的数据行,一些空行,然后是您不感兴趣的一堆数据和说明。您如何读取该文件但停止在空白处?
例如,如果您下载并解压缩以下文档:
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;
它读取底部附近的“额外”行,这些行不是月度数据,而是年度数据。有没有办法停在空白处?
答案 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
将行读取指针重置为第一列,以便它可以正常运行。