我正在尝试确定SAS如何阅读length
语句,然后是informat
语句。我可能会误解,但我的印象是数字变量的informat
语句的工作原理如下:
informat number 5.;
这会给变量 number informat
5,允许5个数字填充它。例如。的 12345
然而,当我运行以下程序时,我有一个9位数的数字987654321,其长度适合数字6,这将代表 137,438,953,472 <的所有数字/ p>
问:长度语句是否“覆盖”informat
语句并允许所有9位数填充变量 number ?所有9位数如何能够适合变量 number 且informat
为5。
data tst;
input number;
length number 6;
informat number 5.;
datalines;
987654321
;
run;
proc print data=tst;
run;
基于此SAS文档: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000199348.htm
w指定输入字段的宽度。范围:1-32
似乎informat w.d
可以像我先描述的那样工作,并且不允许所有9位数填充数字
答案 0 :(得分:2)
因为您正在使用列表模式输入。在那种情况下,SAS会读取下一个单词,无论它多长时间。基本上在列表模式输入中(包括在:
语句中指定的信息之前使用input
修饰符时),将忽略信息上的宽度。
除了在SAS数据集中创建元数据之外,将5.
或$10.
等信息附加到变量上没有多大价值。
date.
等信息不同。 INPUT
语句本身中指定信息。 答案 1 :(得分:1)
变量的长度定义了值存储到磁盘时占用的空间量。 注意:在运行DATA步骤期间,所有数字都是双精度,截断到一个长度&lt; 8仅在输出媒体期间发生。
informat 是与长度分开的概念。 Informat定义如何将传入值表示解释为存储为SAS数值。传入的价值表示将是文本必须处理的内容;是读取文件的INPUT语句,处理输入值的VIEWTABLE字段编辑,EG网格单元编辑等等。
格式是类似的单独概念,它定义了SAS如何为输出呈现数值;无论是PUT语句,VIEWTABLE行渲染,PROC输出中的位置,EG网格单元等等......
<强>解释强>
现在已经不在了,在INPUT声明中明确说明时,信息很荣幸:
data _null_;
attrib number length=6 informat=5.;
input number 5.;
put 'NOTE: ' number=;
datalines;
987654321
run;
===== LOG =====
NOTE: number=98765
并且,当您提问时,未应用与信息相关的变量,未声明明确的数字信息
data _null_;
attrib number length=6 informat=5.;
input number;
put 'NOTE: ' number=;
datalines;
987654321
run;
===== LOG =====
NOTE: number=987654321
所以第一个是指定格式的LIST输入,第二个是简单 LIST输入(因为没有指定格式)。
简单列表输入将接受一些荒谬的大数据,并且结果值虽然不是尾端精确,但将处于正确的指数级别。
data _null_;
attrib number length=6 informat=5.;
input number;
put 'NOTE: ' number= ;
datalines;
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
run;
===== LOG =====
NOTE: number=1.2345679E89
INPUT声明,列表的文档说什么?当然没有任何关于使用变量声明信息时没有指示
简单列表输入
简单列表输入对数据类型设置了一些限制 INPUT语句可以读取:
•默认情况下,至少有一个空白必须分隔输入值。使用 INFILE语句中的DLM =或DLMSTR =选项或DSD选项 指定空白以外的分隔符。
•用句点表示每个缺失值,而不是空白或两个 相邻的分隔符。
•字符输入值不能超过8个字节,除非 变量在较早的LENGTH,ATTRIB或更长的时间内被赋予更长的长度 INFORMAT声明。
•除非您更改,否则字符值不能包含嵌入的空格 分隔符。
•数据必须采用标准数字或字符格式。 (脚注1)
脚注1:有关标准和非标准数据值的信息,请参阅SAS语言参考:概念。 (我的LOL)
&#34; SAS变量属性&#34;的概念状态
了信息
是指SAS在读取数据值时使用的指令。 如果 没有指定信息,默认信息是w.d表示数字 变量和$ w。对于一个字符变量。您可以指定SAS 信息到INFORMAT或ATTRIB语句中的变量。您可以 使用FORMAT过程为变量创建自己的信息。
(我的大胆)
显然没有明确的默认值,例如32.或best32。因为输入超过32位的值没有错误。
文档也解释了什么?是的,好吧,有点儿。有什么收获:
答案 2 :(得分:1)
首先关闭:length
不会覆盖或对信息或读入产生任何影响。 length
仅描述了用于存储数字的字节数,仅此而已。
对于数字变量,信息不是以直观的方式工作。我不确定为什么 - 但他们没有。
中的引文对于字符变量,此格式修饰符从下一个非空白列读取值,直到指针到达下一个空白列,定义的变量长度或数据行的末尾(以先到者为准)。对于数字变量,此格式修饰符从下一个非空白列读取值,直到指针到达下一个空白列或数据行末尾,以先到者为准。
他们确实在某种程度上听取了信息 - 在那里添加一个.2
并且你会得到一个强制小数 - 但是他们不会听到它有多长的价值读入。我不知道为什么;它们似乎应该是直观的,但它们并非如此。
这里有字符变量 - 它们尊重长度但也忽略了信息:
data tst;
length number $9;
informat number $5.;
input number;
datalines;
987654321
;
run;
proc print data=tst;
run;
虽然您确实需要在之前输入信息输入语句(以及数字变量的长度)。
documentation page for INFORMAT上提供了更多详细信息:
当您使用INFORMAT语句分配信息时SAS如何处理变量
使用INFORMAT语句与变量关联的格式行为类似于修改后的列表输入使用的信息。 SAS使用列表输入的扫描功能读取变量,但应用信息。
在修改后的列表输入中,SAS 不使用信息中的w值来指定外部文件中的列位置或输入字段宽度 使用信息中的w值来指定先前未定义的字符变量的长度 忽略数字信息中w的值 在信息中使用d的值与通常用于数字信息的方式相同 除非您在INFILE语句中使用DLM =或DLMSTR =选项规范更改其状态,否则将作为输入数据嵌入的空格视为分隔符。
对于SAS忽略w
的价值这一事实更为明确。