SAS使用infile导入txt文件

input import sas fixed-width delimited

1055 观看

2回复

28 作者的声誉

我正在看两个在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;  
    

我的问题是:
1.为什么“输入”在第一个过程中位于代码的开头,而在第二个过程中位于最后?“输入”的顺序重要吗?

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

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

谢谢!

作者: mumu.W 的来源 发布者: 2016 年 1 月 5 日

回应 (2)


0

14399 作者的声誉

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

    @n将指针移到列n。

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

1

28206 作者的声誉

决定

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

让我们解决详细的问题。

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

构建数据集时,要了解语句顺序的重要事项是该顺序可能对结果产生的影响。SAS将尽快确定您正在使用的变量的定义。因此,如果在FORMAT语句之前放置一条语句,INPUT则可能会影响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语句。

作者: Tom 发布者: 06.01.2016 01:14
32x32