SAS列输入

时间:2017-04-07 19:32:27

标签: input sas

在实现以下代码时,我发现了一个奇怪的输出。

data ex;
    input a $ 1-80 b $;
    datalines;
1 2
3 4
5 6

数据集ex是:

a       b
1 2     3

然后

data ex2;
    input a $ 1-81 b $;
    datalines;
1 2
3 4
5 6

数据集ex2是:

a        b
3 4      5

最后,我创建了一个包含以下内容的txt文件:

1 2
3 4
5 6

并运行

data ex3;
    infile '/.../test.txt';
    input a $ 1-10 b $ ;

数据集ex3是:

a        b
3 4      5

任何人都可以解释缓冲区和PDV如何工作以获得奇怪的结果?非常感谢。

所有结果均基于SAS Studio(大学版)。

2 个答案:

答案 0 :(得分:0)

我明白了

 Obs     a     b

  1     1 2    3

使用此日志

27         data ex;
28             input a $ 1-10 b $;
29             datalines;

NOTE: LOST CARD.
RULE:      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0                     
33         ;;;;
a=5 6 b=  _ERROR_=1 _N_=2
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.EX has 1 observations and 2 variables.

你是在讲述整个故事吗?

答案 1 :(得分:0)

当您从数据线(卡片)读取时,SAS会将​​线条大小调整为80的倍数。从单独的文件读取时不会执行此操作。

所以在这个例子中:

data ex;
  input a $ 1-80 b $;
cards;
1 2
3 4
5 6
;

您将完整的80列卡图像读入A中,然后当您尝试读取B时,它需要转到下一行,因此它将一直读到第2行的第一个空格。因此a='1 2'和{{1 }}。然后,当它试图读取下一个观察时,它将该行读入A并且用尽信息读入B,因此当它读取超过输入结束并且没有写入第二个观察时停止。

在第二个示例中,您尝试读取多于A的完整行,因此SAS转到新行并阅读b='3'。不知道为什么它也没有尝试从该行读取超过80,但看起来它没有。那么当它想要读取B时,它从最后一行得到'3 4'

你的最后一个例子就像第二个例子。您的外部文件可能在第一行只有5个字符。因此,当你试图读取10个字符时,它会跳到下一行读A,然后必须转到最后一行才能找到B要读的内容。

如果您希望它只读取一行中的数据而不是"流动"到搜索数据的下一行,然后将5选项添加到INFILE语句。从卡片图像中读取时,您可以使用INFILE CARDS或INFILE DATALINES。