在实现以下代码时,我发现了一个奇怪的输出。
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 :(得分: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。