我有一个.dat文件,其中包含我需要导入SAS数据集的数字。但是,有很多信息我不需要,而且我只想要特定的数据行(例如,从第1000行开始每隔6行,直到我有100次观察)。我还需要一个基于第一行显示内容的唯一标识符。
例如,.dat文件包含:
DATANOTREQUIRED
DATANOTREQUIRED
DATANOTREQUIRED
UPDATE AAA_1111111_Q_BBBBBB_0_1_#
123.4,
123.5,
124.0,
124.1
DATANOTREQUIRED
DATANOTREQUIRED
DATANOTREQUIRED
UPDATE AAA_1111111__Q_BBBBBB_0_2_#
125.1,
126.0,
127.1,
130.0
我希望最终的SAS数据集看起来像这个
Identifier | Value
X.1. | 124.1
X.2. | 130.0
我在SAS中使用infile并使用输入指向第1000行,但我被卡住了,无法获得我想要的SAS数据集。 (基于以下贡献者的更新代码)
data work.test;
infile '\\filepath\mydatasource.dat' dsd firstobs=1042 truncover;
input #8 ID :$40.
#4 Value1 :8.;
run;
但我现在看到的是标题行显得很好,但第一次观察有一个。而是第一个数据值出现在第二个标题行。
ID | Value1
UPDATE AAA_1111111_Q_BBBBBB_0_1_# | .
UPDATE AAA_1111111__Q_BBBBBB_0_2_# | 124.1
答案 0 :(得分:1)
这是一个例子,假设每个标题行之间的行数相同:
data want;
if _n_ > 2 then stop; /*Stop after we've output 2 rows */
infile cards firstobs=6; /*Skip the first 5 lines in the file*/
input #1 @8 ID :$32.
#5 myvar :8.;
cards;
UPDATE AAA_1111111_Q_BBBBBB_0_1_#
123.4,
123.5,
124.0,
124.1
UPDATE AAA_1111111__Q_BBBBBB_0_2_#
125.1,
126.0,
127.1,
130.0
UPDATE AAA_1111111_Q_BBBBBB_0_3_#
123.4,
123.5,
124.0,
124.1
UPDATE AAA_1111111__Q_BBBBBB_0_4_#
125.1,
126.0,
127.1,
130.0
;
run;
答案 1 :(得分:1)
使用FIRSTOBS =选项跳过文件的开头。 如果每个块总共有5个记录,您可以单独阅读它们。
data want;
infile rawdata dsd firstobs=1000 truncover;
input id :$40. (4*value) (/) ;
run;
或者你可以做类似这样的事情,它应该允许每个id可变数量的值,并保留最后一个。
data want;
infile rawdata dsd firstobs=1000 end=eof;
input @ ;
length id $32 value 8 ;
retain id value;
if _infile_ =: 'UPDATE' then do;
if _n_ > 1 then output;
id = scan(_infile_,-1,' ');
end;
else input value;
if eof and _n_ > 1 then output;
run;