在SAS上读取分隔文件时,可以使用length
语句设置字符变量的长度。但是,用普通数字不能做到这一点(没有逗号,没有美元符号,标准数据等)。通过使用commaw.
信息,从我能想到的内在地设定这些陈述的长度的唯一方法是。这是否合情合理,如果我们只想阅读普通数字,是否有长篇陈述?
我也想知道,如果我有一个数据“$ 105.93”,我可以把它读作dollar3.2
。但阅读它作为dollar12.2
似乎没有什么区别。为什么?
谢谢。
LENGTH是SAS用于在数据集中存储数据的字节数。由于SAS使用64位浮点数,因此数字变量的长度必须介于3到8个字节之间。 (实际上,您可以在IBM大型机上存储少至2个字节的数字,因为它们使用了不同的浮点表示。)格式或信息使用的WIDTH是将值打印为文本所需的字符数。因此,如果您正在阅读或编写像$1,205.93
这样的字符串,则需要使用9个字符。但是因为它是一个数字,你需要用8个字节存储它。因此即使格式宽度比这长,LENGTH也是8。
第二个困惑是,当您使用列表模式INPUT(而不是格式化模式)时,SAS将忽略您可能附加到特定变量的任何信息上指定的宽度。相反,它会将信息应用于它在下一个分隔符之前看到的所有下一个单词。您可以考虑调整信息宽度以匹配数据的宽度。所以,如果运行这样的程序:
data want ;
input id cost ;
informat cost comma1. ;
cards;
1 $103.93
;
COST将被正确设置,因为忽略了informat语句中指定的1
的宽度。请注意,使用:
修饰符允许将信息规范插入INPUT语句而不会导致SAS从列表模式切换到格式化模式时,同样适用。
在FORMAT上,十进制规范告诉SAS要打印的小数点右边有多少位数。但是当你在INFORMAT上添加一个十进制规范时,你会告诉SAS在输入字符串没有小数点时放置小数点。基本上你是在告诉SAS使用10的幂来划分它看到的任何整数值。因此,除非你肯定你的输入流故意消除了1和10之间的时间段,否则你永远不应该为INFORMAT指定任何小数值。所以你不想使用DOLLAR12.2信息。 (另请注意,DOLLAR。和COMMA。信息之间没有区别。在尝试将字符串转换为数字之前,两者都删除了逗号和美元符号。)
在SAS上读取分隔文件时,可以使用length语句设置字符变量的长度。但是,用普通数字不能做到这一点(没有逗号,没有美元符号,标准数据等)。
您可以指定数字变量的长度,但length对应于变量可以存储的字节数。对于数字,一个字节存储多个数字。
这是一个显示如何保存的示例。
data have;
infile cards dlm=';';
length V1 V2 8 V3 4;
informat V1 dollar3.2 V2 best12. V3 dollar8.2;
format v1 dollar12.2 v2 8. v3 dollar8.2;
input v1 v2 v3;
datalines4;
$12.22; 24; $1342
$145.22; 25; $13.42
$45.01; 22; $100.1
;;;;
run;
proc contents data=have;
run;