SAS数字格式与长度

时间:2018-05-16 16:21:52

标签: sas informat

我正在尝试确定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位数填充数字

3 个答案:

答案 0 :(得分:2)

因为您正在使用列表模式输入。在那种情况下,SAS会读取下一个单词,无论它多长时间。基本上在列表模式输入中(包括在:语句中指定的信息之前使用input修饰符时),将忽略信息上的宽度。

除了在SAS数据集中创建元数据之外,将5.$10.等信息附加到变量上没有多大价值。

  • SAS不需要他们理解如何将文本转换为值,这与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位的值没有错误。

文档也解释了什么?是的,好吧,有点儿。有什么收获:

  • 在简单列表输入期间继承其信息的数字变量的人类直觉实际实施的行为不对齐
    • 现有SAS代码的构造量意味着实现这种直觉的变化极不可能
  • 简单的陈述可能涉及许多具有广泛文档的概念
  • 可能的更改是文档将更新为更明确的简单列表输入警告

答案 2 :(得分:1)

首先关闭:length不会覆盖或对信息或读入产生任何影响。 length仅描述了用于存储数字的字节数,仅此而已。

对于数字变量,信息不是以直观的方式工作。我不确定为什么 - 但他们没有。

请参阅list input documentation

中的引文
  

对于字符变量,此格式修饰符从下一个非空白列读取值,直到指针到达下一个空白列,定义的变量长度或数据行的末尾(以先到者为准)。对于数字变量,此格式修饰符从下一个非空白列读取值,直到指针到达下一个空白列或数据行末尾,以先到者为准。

他们确实在某种程度上听取了信息 - 在那里添加一个.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的价值这一事实更为明确。