在SAS上读取分隔文件时,可以使用length
语句设置字符变量的长度。但是,用普通数字不能做到这一点(没有逗号,没有美元符号,标准数据等)。从我能想到的内容中设置这些语句长度的唯一方法是使用commaw.
信息。这是否合情合理,如果我们只想阅读简单的数字,是否有长篇陈述?
我也想知道,如果我有一段数据“$ 105.93”,我可以将其读作dollar3.2
。但是将其作为dollar12.2
阅读似乎没有什么区别。为什么呢?
谢谢。
答案 0 :(得分:1)
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.informats之间没有区别。在尝试将字符串转换为数字之前,它们都会删除逗号和美元符号。)
答案 1 :(得分:0)
在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;