SAS使用infile导入txt文件

SAS import txt file using infile

我正在查看在 SAS 中导入两个 txt 文件的两个过程。第一个文件是固定宽度的。第二个 txt 文件是分隔文件。下面附上 SAS 代码:

  1. DATA filename;  
    INFILE "filelocation";  
    INPUT  
    VAR1 -11  
    VAR2 -16  
    @18 VAR3 MMDDYY10.   
    VAR4 -53;  
    
    INFORMAT VAR1 .;  
    INFORMAT VAR2 .;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 .;  
    FORMAT VAR1 .;  
    FORMAT VAR2 .;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 .;  
    ;  
    RUN;  
    
  2. DATA filename;  
    INFILE "filelocation" DELIMITER="|" MISSOVER  
    DSD LRECL=32767;  
    INFORMAT VAR1 .;  
    INFORMAT VAR2 .;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 .;  
    FORMAT VAR1 .;  
    FORMAT VAR2 .;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 .;  
    INPUT  
    VAR1 $  
    VAR2 $  
    VAR3   
    VAR4 $  
    ;  
    RUN;  
    

我的问题是:
1、为什么"INPUT"在第一个程序中位于代码的开头,而在第二个程序中位于最后? "INPUT" 的顺序重要吗?

  1. 第一个程序中,VAR3前面有一个“@18”,VAR3是一个表示日期的变量,它决定了VAR3从第18位开始。所有的变量都可以使用这个表达式吗? 前任。 @1 VAR1 $
    @13 VAR2 $
    @18 VAR3 MMDDYY10.
    @29 VAR4 $;

  2. 在程序2中,
    输入 VAR1 $
    VAR2 $
    VAR3
    VAR4 $
    为什么变量在“$”符号后没有任何数字来确定变量的长度?

谢谢!

  1. 由于 SAS 处理数据步骤的方式,语句的顺序 并不总是很重要。我不知道在这种情况下它是否重要,但这绝对是非常规的。通常,INFORMAT/FORMAT 出现在输入语句之前。你可以 运行 它并相当容易地检查。
  2. 这是指针控制方式,将读取光标移动到指定列。文档很清楚:

    @n moves the pointer to column n.

  3. $ 指定字符变量,变量的长度或格式不是必需的,可以使用 INFORMAT/FORMAT/LENGTH 语句预先指定。

您所说的主要区别是存储在 FIXED 列位置的数据与 DELIMITED 数据之间的区别。由于您的第一个示例使用具有固定列位置的数据,您可以使用列范围 (1-11) 来读取数据。对于带分隔符的数据,您无法指定固定列(甚至无法读取固定长度),因为您不知道分隔符之间有多少个字符。相反,您必须使用列表模式输入,SAS 将读取值直到下一个分隔符。

让我们来解决详细的问题。

  1. 为什么?因为程序就是这样写的。编写 SAS 代码的方式有很大的灵活性。

在构建数据集时了解语句顺序的重要一点是顺序可能对结果产生的影响。 SAS 将尝试尽快确定您正在使用的变量的定义。因此,如果您在 INPUT 语句之前放置一个 FORMAT 语句,它会影响 SAS 创建的变量类型以及它们在数据步骤中创建的顺序。

  1. 不,它们不一样。

当您要求它读取 VAR1 $ 1-11 时,您是在要求它读取第 1 至 11 列中的任何内容,包括任何嵌入的空白。它还知道您希望将 VAR1 定义为字符(因为您使用了 $)并且它应该有 11 个字节的空间。当您要求它读取 @1 VAR1 $ 时,它会读取从第 1 列开始的下一个单词。它会在第一个空白处停止。因此,如果第 1 至 69 列为空白,它可能会读取第 1 至第 5 列,或者可能读取第 70 至 77 列。它还将使 VAR1 的长度仅为 8(除非您之前定义了它),因为当 SAS 无法告诉您需要不同的长度时,这是字符变量的默认值。

原始程序使用@18 VAR3 MMDDYY10.的原因是因为您需要指定信息格式才能让SAS正确地将数据中的文本转换为SAS用来表示该日期的数字,而您不能这样做具有列范围。

  1. 你不需要长度。您甚至不需要 $ 因为您已经定义了变量类型。

您之前在第一次引用变量时设置了变量的长度。因此 INFORMAT 语句除了应该用于转换正在读取的文本的 INFORMAT 之外,还具有设置变量长度的 副作用 。如果你真的想定义你的变量,你应该使用 LENGTHATTRIB 语句。