为什么SAS字符字段的长度为32,767?

时间:2016-09-13 13:26:54

标签: sas

根据The Little SAS Book,SAS字符数据最长可达2 ^(15)-1。

那1个角色去哪儿了?通常在浮点运算中,我们为浮点数的符号保留一个字节。 SAS角色数据是否会发生类似情况?

1 个答案:

答案 0 :(得分:1)

我没有明确的答案,但我有一个假设。

我认为32,767的长度与场地本身无关; SAS将所有行(在未压缩文件中)存储在相同大小的块中,因此不需要字段长度指示符或空终止符。 IE,在SAS数据集中你会有类似的东西,对于以下数据步骤等效:

data want;
  length name $8;
  input recnum name $ age;
datalines;
01 Johnny 13
02 Nancy 12
03 Rachel 14
04 Madison 12
05 Dennis 15
;;;;
run;

你会有这样的事情。标题当然不是那样写的,而只是打包的字节序列。

<dataset header>
Dataset name: Want
Dataset record size: 24 bytes
... etc. ...
<subheaders>
Name character type length=8
Recnum numeric type length=8
Age numeric type length=8
... etc. ...
<first row of data follows>
4A6F686E6E792020000000010000000D
4E616E6379202020000000020000000C
52616368656C2020000000030000000E
4D616469736F6E20000000040000000C
44656E6E69732020000000050000000F
<end of data>

变量直接相互运行,SAS知道一个人在哪里开始,一个人从子标题中的信息停止。 (当然这只是一个PUT语句;我认为在实际文件中,如果我没记错的话,首先会存储整数;但这个想法是一样的。)

从技术上讲,.sas7bdat规范并不是一个公开披露的规范,但有几个人已经解决了文件格式的大部分工作原理。一些R程序员有written a specification虽然读取有点挑战确实提供了一些信息。

它表示4个字节用于指定字段长度,这足够32767(足够20亿),所以这不是明确的答案;我想它最初可能是2个字节,并且在SAS的开发中稍后改为4,但是.sas7bdat是最​​近创建的一个全新的文件类型(版本7,因此sas7bdat;我们现在在9)。

另一种可能性,也许更可能的是,在1999年之前,ANSI C标准只要求C编译器支持最小32767字节的对象 - 这意味着编译器不必支持大于32767字节的数组。虽然其中许多确实支持更大的阵列/对象,但SAS可能正在使用最低标准来避免不同操作系统和硬件实现的问题。有些背景,请参阅ANSI C标准的this discussion。这种类似性质的另一种语言的限制(因为SAS使用了几种不同的语言)也是错误的。 [感谢FriedEgg开始这个想法(离线)。]