【问题标题】:How to import specific lines from dat file如何从 dat 文件中导入特定行
【发布时间】:2023-03-18 11:05:01
【问题描述】:

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

【问题讨论】:

  • 每个标题行之间的行数是否总是相同?您需要使用什么逻辑来构建您的唯一 ID?
  • 是的,每个标题行之间的行数总是相同的。唯一 ID 的逻辑是这样的:始终以 X 开头,后跟标题行中的倒数第二个数字(在 UPDATE AAA_1111111_Q_BBBBBB_0_1_# 的情况下,数字为零。如果为零,则使用 a 。)后面是最后一个数字在标题行中。在上面的示例中,这是数字 1。其后是标题行中 # 所在的字符。它在哪里 # 然后使用 . (这通常可以是单个字母字符,如 A B 或 C 等)因此 UPDATE AAA_1111111_Q_BBBBBB_0_1_# 的唯一 ID 是 X.1。

标签: file-io import sas


【解决方案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;

【讨论】:

  • infile 'mydatasource.dat' dsd firstobs=1042 trunco​​ver;输入#8 ID:$40。 #8 @1046 p1 :8.;跑;我现在可以很好地获取 ID,但是从第 1046 行开始并每隔 8 行发生一次的数据给了我空白。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2012-07-24
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多