楼主: SASlearning
24321 20

[原创博文] 一个冒号(:)在SAS中的什么作用 [推广有奖]

  • 0关注
  • 0粉丝

学前班

50%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
1 小时
注册时间
2011-4-30
最后登录
2011-6-1

楼主
SASlearning 发表于 2011-4-30 12:28:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我是SAS新手,正在自学SAS。现在碰到一个问题自己想不明白,请高人指点。
这里有两段SAS程序,唯一的差别是一个冒号(:),但给出的结果不同。我也仔细读过了SAS的帮助功能,但还是不明白。
data meeting;
   input region $ mtg : mmddyy8.;
   sendmail=mtg-45;
   datalines;
N  11-24-99
S  12-28-99
E  12-03-99
W  10-04-99
;
proc print data=meeting;
   format mtg sendmail date10.;
   title 'When To Send Announcements';
run;

结果是
                   Obs    region           mtg      sendmail
                    1       N        24NOV1999     10OCT1999
                    2       S        28DEC1999     13NOV1999
                    3       E        03DEC1999     19OCT1999
                    4       W        04OCT1999     20AUG1999

如果把上述程序中  input region $ mtg : mmddyy8.;的冒号(:)去掉,则得到的结果就是
                   Obs    region          mtg     sendmail
                     1       N       24NOV2009    10OCT2009
                     2       S       28DEC2009    13NOV2009
                     3       E       03DEC2009    19OCT2009
                     4       W       04OCT2009    20AUG2009
这可是相差10年呢。我知道yearcutoff的默认是1920,但不明白 ":" 会有什么影响。
谢谢指点。
二维码

扫码加我 拉你入群

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

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

关键词:announcement yearcutoff Meeting Region Meetin title 程序

回帖推荐

ntsean 发表于7楼  查看完整内容

这个冒号叫做 colon modifier, 一般用于防止数据读不全 你这里的情况,用:的意思就是一直读到遇到空格为止(如果是字符串变量那么就读到空格或者定义的冒号后面长度,哪个先满足就哪个)。 读完region以后指针就在region数据后面那个空格处,加上mtg的8个字符,一共需要读9个字符 但是你如果用mmddyy8. 的话就只能读到 11-24-9, 如果加个冒号那么就保证能读到空格位置,所以能读成11-24-99, 如果你把 mmddyy8.改成mmddyy9. 那么 ...

本帖被以下文库推荐

沙发
zhu1886 发表于 2011-4-30 13:11:09
你的程序我运行了.format中date10.要改成date9.  但去掉(:)和没去掉是一样的,显示的都是正确的时间。

藤椅
minifox 发表于 2011-4-30 21:45:35
zhu1886 发表于 2011-4-30 13:11
你的程序我运行了.format中date10.要改成date9.  但去掉(:)和没去掉是一样的,显示的都是正确的时间。
可我也試了改format, 有沒有:的結果仍舊不同...  @@
而且這似乎跟format無關
資料讀入的數值, 有無:就已經會造成差異了

但原因我也查不出來 @@   不知道有沒有高手能解釋

板凳
zhaoping603 发表于 2011-5-3 10:17:47
一般日期型的变量要是写在第一个位置就不用加冒号,除此之外 要加冒号,意思是,从第一个不是空格的读起。只要前面有空格,最好说明从第一个非空格读起,用冒号。
data meeting;
   input  mtg  mmddyy8. region $;
   sendmail=mtg-45;
   datalines;
11-24-99  N
12-28-99  S
12-03-99  E
10-04-99  W
;

报纸
drhseu 发表于 2011-5-3 16:51:42
Dropping Automatically Variables with Only Missing Values.pdf (57.28 KB, 需要: 3 个论坛币)

地板
sas_user 发表于 2011-5-4 11:05:06
对不起,谢谢ntsean。改一下。
当变量下面的观察值不一样长时,我们会定义变量的长度为大于或等于最长的观察值。当sas读到小于定义的长度的观察值时, 就会继续读下一个变量直到读满定义的长度为止。  冒号在这个code里的作用是为了让sas在读满8个非空字符或者遇到空格时停止。它其实相当于informat 加list input. 以下的两个code效果是一样的。

data meeting;
   input region $ mtg  : mmddyy8.  ;
   sendmail=mtg-45;
   format mtg sendmail date9.;
   put _all_;
   datalines;
N  11/24/99
S  12-28-99
E  12-03-99
W  10-04-99
;
data meeting;
    informat region $3. mtg mmddyy8.;
   input region mtg ;
   sendmail=mtg-45;
   format mtg sendmail date9.;
   put _all_;
   datalines;
N  11/24/99
S  12-28-99
E  12-03-99
W  10-04-99
;

7
ntsean 发表于 2011-5-4 11:34:29
这个冒号叫做 colon modifier, 一般用于防止数据读不全
你这里的情况,用:的意思就是一直读到遇到空格为止(如果是字符串变量那么就读到空格或者定义的冒号后面长度,哪个先满足就哪个)。
读完region以后指针就在region数据后面那个空格处,加上mtg的8个字符,一共需要读9个字符
但是你如果用mmddyy8. 的话就只能读到 11-24-9, 如果加个冒号那么就保证能读到空格位置,所以能读成11-24-99, 如果你把 mmddyy8.改成mmddyy9. 那么就都一样了
可以搜索colon modifier查看其用法

8
sas_user 发表于 2011-5-4 11:41:07
7# ntsean

谢谢,学习了。

9
lihanfeng371 发表于 2011-5-4 14:56:52
学习了,顶!

10
crackman 发表于 2011-5-4 19:22:01

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 05:54