SAS中文论坛
标题:
跟crakman做sas base认证试题(2)
[打印本页]
作者:
shiyiming
时间:
2010-11-10 22:02
标题:
跟crakman做sas base认证试题(2)
From crackman's blog on Baidu
<p><font size="4">2.Given the following raw data records in TEXTFILE.TXT:<br>
<br>
----|----10---|----20---|----30<br>
John,FEB,13,25,14,27,Final<br>
John,MAR,26,17,29,11,23,Current<br>
Tina,FEB,15,18,12,13,Final<br>
Tina,MAR,29,14,19,27,20,Current<br>
<br>
The following output is desired: <br>
<br>
Obs Name Month Status Week1 Week2 Week3 Week4 Week5 <br>
<br>
1 John FEB Final $13 $25 $14 $27 . <br>
2 John MAR Current $26 $17 $29 $11 $23 <br>
3 Tina FEB Final $15 $18 $12 $13 . <br>
4 Tina MAR Current $29 $14 $19 $27 $20 <br>
<br>
Which SAS program correctly produces the desired output?</font></p>
<p><font size="4"> A.<br>
data WORK.NUMBERS; <br>
length Name $ 4 Month $ 3 Status $ 7; <br>
infile 'TEXTFILE.TXT' dsd;<br>
input Name $ Month $;<br>
if Month='FEB' then input Week1 Week2 Week3 Week4 Status $;<br>
else if Month='MAR' then input Week1 Week2 Week3 Week4 Week5 Status $;<br>
format Week1-Week5 dollar6.;<br>
run; <br>
proc print data=WORK.NUMBERS;<br>
run; <br>
<br>
B.<br>
data WORK.NUMBERS; <br>
length Name $ 4 Month $ 3 Status $ 7; <br>
infile 'TEXTFILE.TXT' dlm=',' missover; <br>
input Name $ Month $;<br>
if Month='FEB' then input Week1 Week2 Week3 Week4 Status $;<br>
else if Month='MAR' then input Week1 Week2 Week3 Week4 Week5 Status $;<br>
format Week1-Week5 dollar6.;<br>
run; <br>
proc print data=WORK.NUMBERS;<br>
run; <br>
<br>
C.<br>
data WORK.NUMBERS; <br>
length Name $ 4 Month $ 3 Status $ 7; <br>
infile 'TEXTFILE.TXT' dlm=',';<br>
input Name $ Month $ @; <br>
if Month='FEB' then input Week1 Week2 Week3 Week4 Status $;<br>
else if Month='MAR' then input Week1 Week2 Week3 Week4 Week5 Status $;<br>
format Week1-Week5 dollar6.;<br>
run; <br>
proc print data=WORK.NUMBERS;<br>
run; <br>
<br>
D.<br>
data WORK.NUMBERS; <br>
length Name $ 4 Month $ 3 Status $ 7; <br>
infile 'TEXTFILE.TXT' dsd @;<br>
input Name $ Month $;<br>
if Month='FEB' then input Week1 Week2 Week3 Week4 Status $;<br>
else if Month='MAR' then input Week1 Week2 Week3 Week4 Week5 Status $;<br>
format Week1-Week5 dollar6.;<br>
run; <br>
proc print data=WORK.NUMBERS;<br>
run; <br>
<br>
Answer: C</font></p>
<p><font size="4">这道题其实考察的是读入外部文本数据时几个知识点,1.INFILE语句读入外部数据时候,参数MISSOVER以及DSD DLM的参数意义;2.INPUT读入数据的指针;3.@符号对指针的影响。<br>
下面逐个对着程序,来解剖一下执行过程。<br>
A.DSD:规定若一个数据是由引号,那么SAS认为引号内的逗号也是属于字符数据;设定默认分隔符为逗号;连续两个分隔符之间的数据位缺失值;读入数据时去掉引号。<br>
input语句在读入观测时,先从第一行“John,FEB,13,25,14,27,Final”读取数据“John,FEB”就转入到了第二行“John,MAR,26,17,29,11,23,Current”,那么因为month="FEB"是true<br>
所以接着在第二行“John,MAR,26,17,29,11,23,Current”,读入week1 week2,但是john mar都是字符型,而week1 week2默认为数值型,所以就是缺失值。继续读入week3 week4也就是26 17<br>
接着就是status 是29。读完之后回到infile,回到input,从第三行开始读"Tina,FEB,15,18,12,13,Final",读入name month之后,转达到第四行“Tina,MAR,29,14,19,27,20,Current”。<br>
B.MISSOVER:组织INPUT从下一个数据行中读入数据,未赋值的变量就是缺失值。<br>
其实从A看出,因为第一次INPUT只读入第一数据行两个值,指针转入到第二行了。那么MISSOVER是否可以阻止呢?肯定不能阻止,因为INPUT第一次就只读入两个数据,而且第一行的数据也是</font></p>
<p><font size="4">大于2个的,所以根本就无需阻止。自己读完两个数据之后自动转向第二行。不能让第一次和第二次的input指针保留在同一行中。<br>
C.正确答案。原因很简单,因为@符号,让第一个INPUT读完数据之后,指针依然留在第一个数据行,等待第二个INPUT来读入后续的数据。<br>
D.不用解释。INFILE后面加一个@本身就是错误,编译错误</font></p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/a9f21491136540187af48043.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%B8%FAcrackman%D7%F6sas%20base%C8%CF%D6%A4%CA%D4%CC%E2">跟crackman做sas base认证试题</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/a9f21491136540187af48043.html#comment">查看评论</a>
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2