确实,
我也希望这个输入语句能像你一样工作,但事实并非如此。如此日志所示,在 Cap1 之后放置 $ 也不能解决它。
26 INPUT Sex $ AgeGroup $ Weight Cap1 $ - Cap6 $;
_
22
ERROR 22-322: Expecting a name.
你可以解决它
通过在读取变量之前为其分配格式,例如format Cap1 - Cap6 $2.;
为了测试它,
我将数据包含在源文件中,即使用datalines
DATA Capture;
INFILE datalines DLM='09'x DSD missover FIRSTOBS=1;
format Sex $1. AgeGroup $9. Weight 8.2 Cap1 - Cap6 $2.;
INPUT Sex AgeGroup Weight Cap1 - Cap6;
datalines;
M 1-5 24.5 11 12 13 14 15 16
M 6-10 34.2 21 22 23 24 25 26
;
proc print;
proc contents;
RUN;
如何理解:
SAS 最初是为不关心数据格式的非开发人员(即统计学家)创建的编程语言,因此 SAS 为您做了很多猜测工作(就像 VBA 一样,如果你不使用 option explicit)。
因此,当您第一次在 data 步骤中提及变量名称时,SAS 会将具有适当类型(数字或字符)和长度的变量添加到程序数据向量 (PDV),但这是猜测工作。
例如:SAS标准安装中包含的测试数据集CLASS中的第一个学生是男性,
data WORK.CLASS;
set sasHelp.CLASS;
select (sex);
when ('M') gender = 'male';
when ('F') gender = 'female';
otherwise gender = 'unknown';
end;
run;
导致将“女性”截断为四个位置:
您可以通过指示 sas 预先将变量添加到 PDV 来纠正这种情况。
对于字符变量,
-
format myName $20.; 和
-
length myName $20.; 是等价的
-
informat myName $20.; 也差不多。
(不过,用户定义的格式会使故事变得更加复杂。)
对于数字,有很大的不同:
-
length mySize 8.; 在 PDV 中为 mySize 保留 8 个字节
-
format mySize 8.; 告诉 SAS 打印或显示 mySize 最多 8 位数字,没有小数
-
informat mySize $20.; 告诉 SAS 在读取 mySize 时需要 8 位不带小数的数字。
数字只能有一定的长度,具体取决于操作系统。在窗户上
-
8. 是默认值,在大多数数据库中对应于双精度
-
4. 对应一个浮点数
-
3. 是最小值,我将其用于布尔值
格式可以非常不同
-
format mySize 8.3; 告诉 SAS 用 8 个字符打印 mySize,包括 3 个小数用于小数 (如果它具有正值,则在小数点之前最多留出 4 个小数的空间。将打印更少的小数以显示更大的数字)
-
format mySize 8.3; 告诉 SAS 读取 mySize 假设最后 3 位小数是小数,所以 12345678 将被解释为 12345.678
然后有特殊的格式来读写日期、时间等以及用户定义的值和图片格式,但这让我走得太远了。