阅读双重追踪@@

时间:2016-04-02 17:57:02

标签: input sas datastep

输入:

G0894 x 1 x 3 x 1 k 1
C4458 x 1 k 5
C9057 x 7 x 4 x 4 x 3 x 5

期望的输出:

G0894 x 1
G0894 x 3
G0894 x 1
G0894 k 1
C4458 x 1
C4458 k 5
C9057 x 7
C9057 x 4
C9057 x 4
C9057 x 3
C9057 x 5

这就是我提出的:

data want;
    infile cards missover;
    input id $ @;
    do while (1);   
        input letter $ number @;
        if letter EQ ' ' then leave;
    output;
end;
cards;
G0894 x 1 x 3 x 1 k 1
C4458 x 1 k 5
C9057 x 7 x 4 x 4 x 3 x 5
;
run;

工作但是因为我们一直在讨论在课堂上双重追尾@@我认为我应该使用它。这是我的另一种方法:

data want;
    infile cards missover;
    input id $ @;
    input letter $ number @@;
cards;
G0894 x 1 x 3 x 1 k 1
C4458 x 1 k 5
C9057 x 7 x 4 x 4 x 3 x 5
;
run;

它会产生一个错误,说明以不一致的方式使用missover@@。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的程序中无法使数据步骤前进到第二行输入数据。这就是错误消息告诉你的。

@@告诉SAS它应该在开始下一个数据步迭代时保持行指针和列指针相同。 MISSOVER选项告诉SAS在找不到满足当前输入请求的数据时不要转到新行。因此,行指针无法前进到第二行。

答案 1 :(得分:0)

符号的双尾随符(@@)在DATA步骤的多次迭代中保存记录,直到达到记录的末尾。但是,当控制返回到DATA步骤的顶部时,符号(@)的单个尾随释放记录。

试试这个:

data want;
    infile cards missover;
    input id $ letter $ number @;
    do while (letter ne '' or number ne .);
        output;
        input letter $ number @;
    end;
cards;
G0894 x 1 x 3 x 1 k 1
C4458 x 1 k 5
C9057 x 7 x 4 x 4 x 3 x 5
;
run;