如何从dat文件导入特定行

时间:2017-05-02 07:58:43

标签: file-io import sas

我有一个.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

2 个答案:

答案 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;