【问题标题】:SAS import txt file using infileSAS使用infile导入txt文件
【发布时间】:2016-04-08 21:30:20
【问题描述】:

我正在研究在 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. 为什么“INPUT”在第一个程序的代码开头,而在第二个程序的最后? “INPUT”的顺序重要吗?

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

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

谢谢!

【问题讨论】:

  • 一次问题太多了。请将您的问题简化为每个帖子一个。
  • 感谢您的建议。我把它缩小到三个问题,它们都是相关的。希望这更好理解。

标签: input import sas fixed-width delimited


【解决方案1】:

您所说的主要区别是存储在 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 语句。

【讨论】:

  • 谢谢汤姆!您的回答非常翔实,并澄清了我的困惑。感谢您的宝贵时间和帮助。
【解决方案2】:
  1. 由于 SAS 处理数据步骤的方式,语句的顺序 并不总是重要的。我不知道在这种情况下它是否重要,但这绝对是非常规的。通常,INFORMAT/FORMAT 位于输入语句之前。不过,您可以运行它并相当容易地进行检查。
  2. 这是指针控制方法,将读取光标移动到指定列。文档很清楚:

    @n 将指针移动到第 n 列。

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

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多