输入:
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
和@@
。我做错了什么?
答案 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;