SAS 输入和信息格式操作顺序

SAS Input and Informat Order of Operations

我很好奇 SAS 如何处理信息格式以及使用信息格式输入语句。这些语句的 "order of operations" 是什么?我包含了 SAS EG 导入向导生成的程序中的示例片段。

免责声明:我很少使用 EG 导入向导,但我的雇主要求我们尽可能使用 EG,即创建新程序,所以我很好奇这个功能是如何工作的。

数据:
TimeStamp 01/01/2019 12:00:00 AM

EG 生成代码示例:

data Input;
length TimeStamp 4;
format TimeStamp mmddyy10.;
informat TimeStamp mmddyy10.;
...some infile statement...
input TimeStamp : Best32;
TimeStamp = DatePart(TimeStamp);
run;

上面的例子是EG生成的代码,但是我很好奇为什么会生成这些语句。当我的导入向导显示 DateTime18.

时,我也不确定为什么 SAS 在输入语句中使用 : Best32 信息

历史上,使用 BASE SAS,我只使用过:

  1. 带输入语句的信息
  2. 一个信息格式语句,然后是一个后续的输入语句。输入 语句将只包含变量名。

#1 示例:

Data Test;
...infile...;
input @1 TimeStamp DateTime18.;
...format...;
run;

#2 示例:

Data Test2;
...infile...;
informat TimeStamp DateTime18.;
input TimeStamp;
...format...;
run;

示例 #1 是否只是示例 #2 的 shorthand?如果是这样,为什么 EG 会生成额外的步骤?在 EG 生成的代码中 - informat 语句如何不覆盖 input 语句 informat

INFORMATFORMAT 语句不可执行。因此,您可以将它们放在数据步骤中的任何位置(不包括强制为编译器尚未键入的变量定义类型的副作用)。请注意,这也意味着如果您将多个 FORMAT(信息格式)分配给同一个变量,最后一个将被使用。

当 INPUT 语句执行您在 INPUT 语句中包含的任何显式信息格式规范时,它本身将覆盖与变量关联的任何信息格式。再次注意,如果变量尚未被编译器键入,那么 INPUT 语句如何使用变量将导致为变量选择类型。

因此,为了获得最可预测的结果,您应该定义变量,而不是让 SAS 根据它们首次出现的方式进行猜测。您可以使用 LENGTH 语句或 ATTRIB 语句来定义它们。或者通过使用 SETMERGE 和其他语句拉入现有数据集来定义它们。那么 INPUT、FORMAT 和 INFORMAT 语句的顺序将无关紧要。

您可能不得不问 SAS 为什么 Enterprise Guide Wizard 以这种方式工作。我的理解是,对于某些文件(如 Excel 电子表格),它会将数据转换为文本文件并上传它生成的文本文件。所以我假设 EG 将 DATE 和 TIME 值生成为原始天数或秒数,这就是它使用普通数字信息而不是日期或时间信息读取值的原因。我假设它将一个 INFORMAT 附加到日期和时间变量,以便数据集定义中的元数据填充与所附加格式相匹配的内容。

至于为什么他们使用 BEST32. 信息格式我不知道。 SAS 中并没有真正的 BEST 信息格式,因此它实际上只是 32. 的别名(或者他们可以使用 F32.)。 "best" 对于信息格式的概念甚至没有真正意义。 BEST 格式 用于计算出这个特定数字的最佳数字组合是什么,以生成近似于有限数量字符的值。为了将一串字符读入一个数字,SAS 只需要读取数字并将其转换为它们所代表的数字。没有涉及任何 "best" 个备选方案。