在输入ID和ANS(错误程序)中添加@1:
DATA SCORE;
ARRAY KEY[10] $ 1 _TEMPORARY_;
ARRAY ANS[10] $ 1;
IF _N_ = 1 THEN
DO I=1 TO 10;
INPUT KEY[I] @;
END;
INPUT @1 ID $ @5 (ANS1-ANS10) ($1.);
RAWSCORE = 0;
DO I=1 TO 10;
RAWSCORE = RAWSCORE + (ANS[I] EQ KEY[I]);
END;
PERCENT = 100*RAWSCORE/10;
DROP I;
DATALINES;
A B C D E E D C B A
001 ABCDEABCDE
002 AAAAABBBBB
;
PROC PRINT DATA=SCORE;
TITLE "SCORE Data Set";
ID ID;
VAR RAWSCORE PERCENT;
RUN;
这是本书
课本上的原始程序,ID的INPUT语句中没有@1,它会给出所需的输出;如果我在 ID 处添加列指针,如下所示,它将再次读取键,即第一个数据线,即使存在 IF THEN 语句并使用 N 来测试它是否是第一个数据线。
谁能解释一下这个专栏@1有什么问题,为什么@5这个程序没问题?
您缺少另一个 INPUT 语句。
在数据步骤的第一次迭代中,您首先运行 10 个带有 @ 的 INPUT 语句。所以你还在第一线。
如果您添加指针运动以移回到第一列,那么您第一次尝试读取 ID 将改为读取第一个 KEY 值。
由于程序不使用 TRUNCOVER (甚至不使用古老的 MISSOVER)选项,因此将应用 FLOW OVER 的默认操作。在这种情况下,只要第一行没有第十一个 KEY 值,没有指针运动控制的 INPUT 语句在第一行末尾没有找到任何满足 ID 输入的内容时就会跳到第二行.
当你完成第一行时,可能值得更明确地说明。
IF _N_ = 1 THEN DO:
DO I=1 TO 10;
INPUT KEY[I] @;
END;
INPUT;
END;
INPUT ID $ @5 (ANS1-ANS10) ($1.);