2

我试图确定 SAS 是如何读取length语句的,然后是informat语句。我可能会误解,但我的印象是informat数字变量的语句是这样工作的:

informat number 5.;

这将使变量编号informat5,允许 5 个数字填充它。EG 12345

但是,当我运行以下程序时,我有一个包含 9 位数字的数字 987654321,其长度适合数字 6,它将表示最多137,438,953,472的所有数字

问:长度语句是否“覆盖”informat语句并允许所有 9 位数字填充变量?所有 9 位数字如何适合带有5.的可变数字?informat

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 位数字都填写数字

4

3 回答 3

2

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

5.除了在 SAS 数据集中创建元数据之外,将诸如或之类的信息附加$10.到变量没有太大价值。

  • SAS 不需要他们了解如何将文本转换为值,这与date..
  • 在列表模式下,它会忽略宽度部分。
  • 在格式化输入中,宽度很重要,您必须在INPUT语句本身中指定信息。
于 2018-05-16T18:00:25.727 回答
1

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

对于数值变量,信息的工作方式不是很直观。我不知道为什么——但他们不知道。

请参阅列表输入文档中的此引用:

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

他们确实在一定程度上听取了信息——在.2那里添加一个,你会得到一个强制的小数——但他们不听关于要读入多长时间的值。我不知道为什么;他们应该这样做似乎很直观,但事实并非如此。

这是字符变量 - 它们尊重长度但也忽略信息:

data tst;
length number $9;
informat number $5.;
input number;
datalines;
987654321
;
run;

proc print data=tst;
run;

尽管您确实需要将信息放在输入语句之前(以及数字变量的长度)。

有关 INFORMAT 的文档页面提供了更多详细信息:

使用 INFORMAT 语句分配信息时 SAS 如何处理变量

使用 INFORMAT 语句与变量关联的信息的行为类似于与修改后的列表输入一起使用的信息。SAS 使用列表输入的扫描功能读取变量,但应用信息。

在修改后的列表输入中,SAS 不使用 informat 中的 w 值来指定列位置或外部文件中的输入字段宽度 在 informat 中使用 w 的值来指定先前未定义的字符变量的长度 忽略 w 的值in numeric informats 使用 d 的值在 informats 中的值与它通常用于 numeric informats 的方式相同 将嵌入作为输入数据的空白视为分隔符,除非您在 INFILE 语句中使用 DLM= 或 DLMSTR= 选项规范更改它们的状态。

这更清楚地表明 SAS 忽略w.

于 2018-05-16T16:42:30.363 回答
1

变量的长度定义了值存储到磁盘时占用的空间量。 注意:在运行 DATA 步期间,所有数字都是双精度的,长度小于 8 的截断只发生在输出媒体期间。

信息是与长度不同的概念。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 Statement, List的文档是怎么说的?在没有指明的情况下使用声明的变量当然没有任何意义

简单列表输入

简单的列表输入对 INPUT 语句可以读取的数据类型有几个限制:

• 默认情况下,必须至少用一个空格分隔输入值。在 INFILE 语句中使用 DLM= 或 DLMSTR= 选项或 DSD 选项来指定除空白之外的分隔符。

• 用句点表示每个缺失值,而不是空格或两个相邻的分隔符。

• 字符输入值不能超过 8 个字节,除非在前面的 LENGTH、ATTRIB 或 INFORMAT 语句中为变量指定了更长的长度。

• 字符值不能包含嵌入的空格,除非您更改分隔符。

• 数据必须采用标准数字或字符格式。(脚注 1)

脚注 1:有关标准和非标准数据值的信息,请参见 SAS 语言参考:概念。(我的大声笑)

“SAS 变量属性”状态的概念

信息

指 SAS 在读取数据值时使用的指令。如果未指定信息,则默认信息是数字变量的 wd和 $w。对于字符变量。您可以将 SAS 信息分配给 INFORMAT 或 ATTRIB 语句中的变量。您可以使用 FORMAT 过程为变量创建自己的信息。

(我的大胆)

显然没有明确的默认值,例如 32. 或 best32。因为超过 32 位的值将被正确输入。

那么文档是否解释了一些事情?是的,嗯,有点。有什么收获:

  • 在简单列表输入期间继承其信息的数值变量的人类直觉实际实现的行为不一致
    • 现有 SAS 代码的构造数量意味着实现这种直觉的改变是极不可能的
  • 简单的陈述可能涉及大量的概念和广泛的文档
  • 可能的变化是文档将被更新以更明确地说明简单列表输入警告
于 2018-05-16T16:40:59.923 回答