【问题标题】:Why is the length of the SAS character field 32,767?为什么SAS字符域的长度是32767?
【发布时间】:2016-09-13 13:26:54
【问题描述】:

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

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

【问题讨论】:

  • 这似乎是一个合理的猜测。
  • @GordonLinoff 为什么这是一个合理的猜测?我无法想象为什么你需要一个长字符串的符号......我自己对此的答案很好奇。它很可能是其他一些非数据元素,或者它可能只是 SAS 的任意选择......
  • 也许是为了在一些底层 C 代码中允许null terminator
  • 你的意思是“那一位去哪儿了?”。因为我将问题解释为“长度的字节在哪里”,而答案是“通常在字符串的开头。
  • @GordonLinoff 我认为问题是“为什么不是 32768”,那么,第 32768 个字节“去”到哪里(它的用途)。我不知道 SAS 有一个字符串的长度字节(尽管可能有);通常像数据结构这样的东西是在数据文件的第一页或第二页中定义的,所以没有必要有一个字符串长度字节。 (如果有长度字节,SAS 将支持 VARCHAR,但不支持。)

标签: sas


【解决方案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 提出这个想法(离线)。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多