2017-04-07 102 views
0

实现以下代码时,我发现了一个奇怪的输出。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(大学版)。

回答

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. 

你说的是整个故事?

+0

对不起,让你困惑。我现在纠正这个问题。下一次,我会在发布之前仔细检查。 –

0

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

所以在这个例子:

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

您阅读完整的80列卡图像分为A,那么当您尝试查看B它需要去下一行,因此它读取,直到从第一空间第2行。因此,a='1 2'b='3'。然后,当它试图读取下一个观察结果时,它将行读入A中,并且用完信息以读入B,从而当它读取超过输入末尾并且没有写入第二个观测值时停止。

在第二个示例中,您尝试读取比A更多的全部内容,因此SAS进入新行并阅读'3 4'。不知道为什么它不会尝试从该行读取超过80个,但看起来没有。那么当它想要读取B时,它会从最后一行获得5

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

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