你如何向某人解释一个"字节"在LENGTH
声明中?我一直认为1个字节等于1个字符或1个数字,但似乎并非如此。另外,为什么它的语法与FORMAT
语句的语法不同?即:
/*FORMAT Statement Syntax*/
FORMAT variable_name $8.;
/*LENGTH Statement*/
LENGTH variable_name $ 8
答案 0 :(得分:4)
语法不同,因为它们做了不同的事情。 LENGTH
语句定义变量的类型以及将变量存储在数据集中所需的空间。 FORMAT
语句定义了要附加到变量的FORMAT,以便SAS在将值写入日志或输出窗口时知道如何转换变量。
length语句中的$表示您正在定义一个字符变量。格式语句中的$只是您附加到变量的格式名称的一部分。可以与字符变量一起使用的格式以$
开头,而数字格式则不能。格式需要有一个句点,以便SAS可以将它们与变量名称区分开来。但是LENGTH语句中使用的长度是整数,因此不需要句点(尽管如果在整数值之后添加它们,SAS将忽略它们。)
我在SAS代码中看到很多混淆,其中使用FORMAT语句,就像它用于定义变量一样。这只能起作用,因为SAS会在第一次出现在数据步骤时猜测如何定义变量。因此,它将使用您附加的格式的详细信息来猜测您的变量类型。因此,如果您首先在赋值语句x=2+3
中引用X,那么SAS将猜测X应该是数字并且给它默认长度为8.但是如果它看到X的第一个位置是像{{1}那样的格式语句然后它会猜测你想让X成为长度为10的字符变量,以匹配格式的宽度。
关于如何表示和存储字符,它取决于您使用的编码。如果您只使用简单的7位ASCII代码,则字符之间存在1-1关系,以及存储它们需要多少字节。但如果您使用的是UTF-8,则最多可能需要4个字节来存储单个字符。
对于数值变量,SAS使用IEEE 64位格式,因此用于存储变量的LENGTH与用于显示变量的格式的宽度之间的关系要复杂得多。最好只将所有数值变量定义为长度8. SAS允许您定义长度小于8个字节的数字变量,但这只是意味着在将值写入SAS数据集时会抛弃那些额外的精度位。存储整数时,只要有足够的位来存储您期望的最大数字,就可以在不损失精度的情况下执行此操作。对于浮点值,您将失去精度。