SAS使用infile导入txt文件

时间:2016-01-05 06:07:03

标签: input import sas fixed-width delimited

我正在研究在SAS中导入两个txt文件的两个过程。第一个文件是固定宽度。第二个txt文件是分隔文件。 SAS代码如下:

  1. DATA filename;  
    INFILE "filelocation";  
    INPUT  
    VAR1 $1-11  
    VAR2 $13-16  
    @18 VAR3 MMDDYY10.   
    VAR4 $29-53;  
    
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    ;  
    RUN;  
    
  2. DATA filename;  
    INFILE "filelocation" DELIMITER="|" MISSOVER  
    DSD LRECL=32767;  
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    INPUT  
    VAR1 $  
    VAR2 $  
    VAR3   
    VAR4 $  
    ;  
    RUN;  
    
  3. 我的问题是:
    1.为什么“INPUT”位于第一个过程中代码的开头,但是在第二个过程的最后一个? “输入”的顺序是否重要?

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

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

    3. 谢谢!

2 个答案:

答案 0 :(得分:1)

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

让我们来处理详细的问题。

  1. 为什么?因为这就是程序的编写方式。编写SAS代码的方式有很多灵活性。
  2. 在构建数据集时,了解语句顺序的重要一点是订单可能对结果产生的影响。 SAS将尽快确定您正在使用的变量的定义。因此,如果在FORMAT语句之前放置INPUT语句,它可能会影响SAS创建的变量类型以及它们在数据步骤中创建的顺序。

    1. 不,他们不一样。
    2. 当你要求它阅读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. 你不需要长度。您甚至不需要$,因为您已经定义了变量类型。
      2. 您之前已首次设置变量的长度。因此,除了应该用于转换正在读取的文本的INFORMAT之外,INFORMAT语句还具有设置变量长度的副作用。如果您确实要定义变量,则应使用LENGTHATTRIB语句。

答案 1 :(得分:0)

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

    @n   将指针移动到列n。

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