楼主: Imasasor
70414 98

[学习分享] 终于总结了一下,truncover, missover, pad选项的意义,以及读取datalines和外部文件   [推广有奖]

  • 1关注
  • 64粉丝

VIP

学科带头人

34%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
36380 点
帖子
866
精华
3
在线时间
2234 小时
注册时间
2012-7-4
最后登录
2023-9-20

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

终于总结了一下,truncover,missover, pad选项的意义,以及读取datalines和外部文件的不同。

missover truncover pad.pdf (256.77 KB)

  1. DATA test1;        /*column input*/
  2.     INFILE "d:\infile\emplist.dat" truncover;
  3.     INPUT lastn $1-21 Firstn $ 22-31
  4.         Empid $32-36 Jobcode $37-45;
  5. RUN;

  6. DATA test2;        /*list input*/
  7.   INFILE "d:\infile\emplist.dat" pad;
  8.   INPUT lastn $ Firstn $
  9.           Empid $ Jobcode $ ;
  10. RUN;

  11. data test3;
  12. input  lastn $1-21 Firstn $ 22-31
  13.         Empid $32-36 Jobcode $37-45;
  14. cards;
  15. LANGKAMM             SARAH     E0045 Mechanic
  16. TORRES               JAN       E0029 Pilot
  17. SMITH                MICHAEL   E0065
  18. LEISTNER             COLIN     E0116 Mechanic
  19. TOMAS                HARALD
  20. WADE                 KIRSTEN   E0126 Pilot
  21. WAUGH                TIM       E0204 Pilot
  22. ;
  23. run;
  24. data test4;
  25. input lastn $ Firstn $
  26.       Empid $ Jobcode $ ;
  27. cards;
  28. LANGKAMM             SARAH     E0045 Mechanic
  29. TORRES               JAN       E0029 Pilot
  30. SMITH                MICHAEL   E0065
  31. LEISTNER             COLIN     E0116 Mechanic
  32. TOMAS                HARALD
  33. WADE                 KIRSTEN   E0126 Pilot
  34. WAUGH                TIM       E0204 Pilot
  35. ;
  36. run;
复制代码


因为对sas inputinfile 读取cards数据和外部文件,如txt, dat数据诸多的疑惑,以及对infile选项 truncover, missover, flowover,pad, lrecl等选项的一知半解。前些日子特地在论坛上提了两个问题:

input读入原始数据,datalinestxt中的区别?

https://bbs.pinggu.org/forum.php?mod=viewthread&tid=1571120&from^^uid=3269938


关于input输入原始数据

https://bbs.pinggu.org/forum.php?mod=viewthread&tid=2145400&from^^uid=3269938


请教了论坛的各位大牛,有davil2000webgu, ziyenano, pobel等等,他们都给出了很好的解释和回答,但总体还是没有一个系统的解答,因此我在总结了各位大牛的回答的基础上,查阅了相关文献,有了一个初步的理解,写出来与大家分享,也希望各位大牛能补充说明。


首先说明,sasinputinfile语句无比强大,可以通过各种输入方式和各种选项实现任何有规律无规律数据的导入,光input, infile的功能我觉得都可以写成一本书了,因此本文不致力于详细讲解inputinfile,事实上很多选项我也不懂,但是可以查阅一下sas help在自己需要的时候使用。本文主要对infile中容易误解的几个选项missover, truncover, pad以及input 列表输入和列输入的不同进行说明。

infile选项汇总.jpg


关于inputcolumninput (列输入)listinput (列表输入).

简单来说:列输入就是严格按照变量指定的长度进行数据读取,忽略分隔符。如input name $1-10;  input home$40.; 都属于列输入。列表输入就是根据规定的分隔符(默认是空格)按照变量的顺序读取数据,多个空格按照一个处理,遇到空格即停止。如input name $ home:$40. ;

假设有如下原始数据:

原始数据.jpg


需要注意的是,在windowsunix中的文本处理器如写字板创建上面的数据,数据每行属于可变长度,每行的长度就是灰色区域的长度,而在sasdatalines中,上述的数据是固定长度的,长度为80 bytes,后面没数据的地方以空格填充,在大型主机的某些数据文件中,数据行也是固定长度的,无数据的地方以空格填充。


首先分别以input的列输入和列表输入导入上述数据,假设数据位于dinfile文件夹中,名字为emplist



DATA test1;   /*column input*/

    INFILE "d:\infile\emplist.dat";

    INPUT lastn $1-21 Firstn $ 22-31

        Empid $32-36 Jobcode $37-45;

RUN;


DATA test2;   /*list input*/

  INFILE "d:\infile\emplist.dat";

  INPUT lastn $ Firstn $

          Empid $ Jobcode $ ;

RUN;

上述程序提交后,结果如何,在此之前,先讲一下flowover选项Infile默认是flowover选项。

在列输入时:如果input指针到了一行的最后一个字符时,有些变量还是没有得到值或者完整的值,指针就会跳到下一行的第一列开始读取数据,来填充没有值的变量。当下次input语句执行的时候,新的一行数据就会进入inputbuffer

因此列输入数据如下:

列输入.jpg


说明,对于第二行数据,pilot没有达到jobcode所需要的长度,因此指针跳到下一行读取smith填补上来。完成之后进入数据步的下一个循环,执行下一次input,因此指针再次跳行,将leistner读入。而读取第五行tomas数据时,harald长度不够firstn用,所以指针跳到下一行将wade读入作为firstn,然后e1026作为empidpilot仍然不够用,所以跳到下一行读取waugh作为jobcode;

在列表输入时,以空格为分隔符,数据可以正确地读入,但默认的flowover选项仍然会导致将下一行数据读入填充缺失值。结果如下:

列表输入.jpg


使用missover选项:

当在infile语句中使用missover选项时,它会抑制掉flowover,使得在读取短的数据行时,input指针不会跳到下一行来读取数据,相反,它使得没有数据的变量变缺失。

在列输入中加上missover选项时,结果如下:


列输入missover.jpg


我们发现的是,再也没有从下一行读取数据,可是jobcodepilot和第6行的后面仍然没有正确读入。这是因为在列输入的时候,如果指针到了一行的结尾,仍然没能读入满足变量长度的数值,就会将该变量变缺失。解决方法:可以再加入pad选项,pad选项数据后面填上空格,使得每行的长度相同,默认lrecl=256

如果列表输入infile加上missover选项,结果如下,不会像列输入那样将最后的变量变缺失。



列表输入missover.jpg

Truncover: 其实truncover的功能类似于missover pad合用的效果,它是针对列输入时,如果一行最后读入的数值仍然不能满足变量需要的长度,不会将变量缺失,而是将读入的值赋给该变量。列输入加truncover的结果同上。

当然,对于列表输入,truncover的结果也同上,是正确的结果。

关于PADpad固名思义,意思是将数据行的后面部分填上空格,这样就使得数据行变长,不致于让input指针在读取短数据行时到达数据行结尾从而跳行。Pad不会抑制flowover的作用,它会将数据后面的空白位置填上空格,空格的长度由lrecl=n决定,默认n256,当然可以在infile选项中修改n的大小。这就是为什么在列输入中用missoverpad可以正确读取数据了,因为数据行的长度不再是数据实际的长度(可变长度),而是一个固定长度256,后面都是空格。

如果列表输入只加pad,不加missover,结果如下


列表输入pad.jpg

Pad不会抑制flowover,并且将多个空格作为一个处理,所以出现了上述结果。



关于读取外部文件和datalines中的区别,很多朋友都发现sas读取外部文件和datalines数据,数据结构完全一样,同样的程序,结果不同。

原因是:外部文件数据,数据行是可变长度,如上例。除非加上pad,以空格填充。

而在cards中的数据,看起来也是可变长度,但其实是固定长度,为80。结尾没有数据的地方都以空格填充。即默认有pad 。引用davil2000大神的回答:

Cardimagesystem option specifies that SAS source and data lines be processed as if thesewere punched card images—all exactly 80 bytes long and padded with blanks.

所以如下两个程序:

data test3;

input lastn $1-21Firstn $ 22-31

        Empid $32-36 Jobcode $37-45;

cards;

LANGKAMM             SARAH     E0045 Mechanic

TORRES               JAN       E0029 Pilot

SMITH                MICHAEL   E0065

LEISTNER             COLIN     E0116 Mechanic

TOMAS                HARALD

WADE                 KIRSTEN   E0126 Pilot

WAUGH                TIM       E0204 Pilot

;

run;

data test4;

input lastn $ Firstn $

      Empid $ Jobcode $ ;

cards;

LANGKAMM             SARAH     E0045 Mechanic

TORRES               JAN       E0029 Pilot

SMITH                MICHAEL   E0065

LEISTNER             COLIN     E0116 Mechanic

TOMAS                HARALD

WADE                 KIRSTEN   E0126 Pilot

WAUGH                TIM       E0204 Pilot

;

run;

列输入可以正确读入,列表输入不行,因为没有missover选项,类同于读取外部文件时只加pad选项。

欢迎各位大神补充讨论。

作个广告(欢迎加入sas高手群:144839730


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:truncover missover Lines cover Over pad

已有 23 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
eijuhz + 100 + 10 精彩帖子
oliyiyi + 100 精彩帖子
goodtolong + 1 + 1 + 1 精彩帖子
xhx194 + 1 精彩帖子
emeishange + 1 + 1 + 1 鼓励积极发帖讨论
笑萧人 + 1 + 1 + 1 对论坛有贡献
vstalent + 1 + 1 + 1 精彩帖子
Tigflanker + 5 + 3 + 3 + 3 太需要了
kmrcx + 1 + 1 精彩帖子
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 620  论坛币 + 165  学术水平 + 35  热心指数 + 33  信用等级 + 31   查看全部评分

本帖被以下文库推荐

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;
沙发
liyichen17 在职认证  发表于 2012-12-2 16:41:28 |只看作者 |坛友微信交流群
学习了。

使用道具

藤椅
freebird2012 发表于 2012-12-2 20:21:52 |只看作者 |坛友微信交流群
thanks

使用道具

板凳
henryyhl 发表于 2012-12-2 21:49:12 |只看作者 |坛友微信交流群
支持楼主。学习,受益匪浅啊。。
It's not going to be easy, but it is going to be worth it.

使用道具

报纸
spssone 发表于 2012-12-2 22:20:53 |只看作者 |坛友微信交流群
非常好啊

使用道具

地板
bobguy 发表于 2012-12-3 00:30:22 |只看作者 |坛友微信交流群
Many years ago computer storage space was very expensive.  Data fed into a computer came on real punched hole cards which represents different characters or numbers. The is why it is called cards statement. Punched card data is always in a fixed length format. Data read in by from position to end position.

The data format is a fixed length. The programs will look like below. This is common input format in languages on IBM machine, for example COBOL. If each data line is not in a fixed length, one needs more flexible ways to deal with it-- that is 'infile' with many different options.


data test3;
input  lastn $1-21 Firstn $ 22-31
        Empid $32-36 Jobcode $37-45;
cards;
LANGKAMM             SARAH     E0045 Mechanic
TORRES               JAN       E0029 Pilot
SMITH                MICHAEL   E0065
LEISTNER             COLIN     E0116 Mechanic
TOMAS                HARALD
WADE                 KIRSTEN   E0126 Pilot
WAUGH                TIM       E0204 Pilot
;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
tzj0017 + 1 + 1 精彩帖子
Imasasor + 12 + 12 + 1 + 1 + 1 分析的有道理

总评分: 经验 + 12  论坛币 + 12  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

使用道具

7
数据分析师3K 发表于 2012-12-3 08:50:06 |只看作者 |坛友微信交流群
精辟发言

使用道具

8
Imasasor 发表于 2012-12-3 10:33:42 |只看作者 |坛友微信交流群
数据分析师3K 发表于 2012-12-3 08:50
精辟发言
谢谢版主,每次都给我加币!
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

使用道具

9
amyhxx 发表于 2012-12-4 06:46:57 |只看作者 |坛友微信交流群
谢谢总结也帮助我不少

使用道具

just want to how TRUNCOVER works, thx~
Learn more, deserve more.

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 11:03