File io 如何从dat文件导入特定行

File io 如何从dat文件导入特定行,file-io,import,sas,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 DAT

我有一个带有数字的.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中使用内嵌,并使用输入指向第1000行,但我被卡住了,无法获得我想要的SAS数据集。(根据下面的贡献者更新了代码)

但是我现在看到的是标题行看起来很好,但是第一个观察结果有一个错误。相反,第一个数据值出现在第二个标题行中

ID                                      | Value1 

UPDATE AAA_1111111_Q_BBBBBB_0_1_#       | .

UPDATE AAA_1111111__Q_BBBBBB_0_2_#      | 124.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;

下面是一个示例,假设每个标题行之间的行数相同:

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;

使用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;

使用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;

每个标题行之间的行数是否始终相同?您需要使用什么逻辑来构造您的唯一ID?是的,每个标题行之间的行数始终相同。唯一ID的逻辑是:始终以X开头,然后是标题行中的最后第二个数字(在更新AAA_1111111_Q_uuuubbbbbb_0_1_35;的情况下,数字是零。如果是零,则使用a。)然后是标题行中的最后一个数字。在上面的示例中,这是数字1。后跟标题行中#所在的字符。在哪里#然后使用。(这通常是一个单数字母字符,如B或C等)因此更新AAA_1111111_Q_uuBBBBBB_0_1_35;是X.1的唯一ID。每个标题行之间的行数总是相同的吗?您需要使用什么逻辑来构造您的唯一ID?是的,每个标题行之间的行数始终相同。唯一ID的逻辑是:始终以X开头,然后是标题行中的最后第二个数字(在更新AAA_1111111_Q_uuuubbbbbb_0_1_35;的情况下,数字是零。如果是零,则使用a。)然后是标题行中的最后一个数字。在上面的示例中,这是数字1。后跟标题行中#所在的字符。在哪里#然后使用。(这通常可以是一个单数字母字符,如B或C等)因此更新AAA_1111111_Q_uBBBBBB_0_35;1_35;的唯一ID是X.1.infle'mydatasource.dat'dsd firstobs=1042 truncover;输入#8id:$40#8@1046 p1:8。;跑我现在可以很好地获得ID,但是从第1046行开始,每第8行发生一次的数据给了我空白。infle'mydatasource.dat'dsd firstobs=1042 truncover;输入#8id:$40#8@1046 p1:8。;跑我现在可以很好地获得ID,但是从1046行开始,每8行发生一次的数据给了我空白。