【问题标题】:Reading from input with double trailing @@从带有双尾随@@的输入中读取
【发布时间】:2016-04-02 17:57:02
【问题描述】:

输入:

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@@。我做错了什么?

【问题讨论】:

    标签: input sas datastep


    【解决方案1】:

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

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

    【讨论】:

    • 您可能想多解释一下 - 为什么会这样可能不是很明显。
    【解决方案2】:

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

    试试这个:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2014-08-02
      • 2014-09-17
      相关资源
      最近更新 更多