SAS数据步骤编程 谢谢
答案 0 :(得分:0)
您可以结合使用infile column=
和input
保持输入@
修饰符来确定保持输入何时经过尾随逗号,以表示将要缺少的值。解释为零units_purchased
的情况。自动变量_infile_
用于检查何时输入语句将自身定位为下一次读取超出数据线的长度。
data want;
infile datalines dsd dlm=',' column=p;
attrib id length=$8 units_purchased length=8 ;
input id @; * held input record;
* loop over held input record;
do while (p <= length(_infile_)+1); * +1 for dealing with trailing comma;
input units_purchased @; * continue to hold the record;
if missing(units_purchased) then units_purchased = 0;
output;
end;
datalines;
C005,3,15,,39
D2356,4,11,,5
A323,3,10,15,20
F123,1,
run;
在这种情况下,有时不会使用更容易使用的@@
修饰符,因为缺少的值将被视为有效输入,因此不能用于断言“不再有数据”条件。 / p>
答案 1 :(得分:0)
由于数据包含值的数量,因此可以使用它来控制DO循环以读取值。我不确定为什么您会丢失按值顺序排列的信息,因此我注释掉了KEEP语句。为了将缺失值转换为零,我使用了sum语句。您可以使用IF / THEN语句或COALESE()函数调用或其他方法将缺失值转换为零。
data Purchase;
infile 'c:\temp\PurchaseRecords.dat' dsd truncover ;
length id $8 ;
input id visit_no @ ;
do visit=1 to visit_no ;
input unitpurchased @;
unitpurchased+0;
output;
end;
* keep id unitpurchased;
run;
您的原始程序有一些错误:
LENGTH
语句来定义变量,而不是强迫SAS猜测如何定义变量。input
语句尝试使用列指针运动命令@nnn
,这是不正确的。加上尚未将指针移至unitpurchased
的变量位置,没有赋值。truncover
语句中包含missover
(甚至是较旧的infile
)选项。