全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4470 4
2010-10-13
data a;
input sb $11. p $9. startdate yymmdd10. enddate yymmdd10.@;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;

第一个问题是当我用@@而不是@的时候,输出的结果如下,而用一个@,结果就是对的6个观测,这是为什么?
Obsserialnumberprod_idstartdateenddate1134048000004711700116892172572  ..3134048000074001710016922176234  ..5134048000124710404917154175926  ..7134048000144710404917143173798  ..91340480001640013004171651728710  ..111340480002047104049169821741012  ..

第二个问题是,这里我用了时间格式,但显然输出的不是我想要的结果,我想20070401作为一个时间来处理,怎么实现?
二维码

扫码加我 拉你入群

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

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

全部回复
2010-10-13 15:11:34
复制代码
1个人觉得没必要用@,详细可见相关帮助
2 换个输入方式......
二维码

扫码加我 拉你入群

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

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

2010-10-13 16:33:26
建议用Formatted Input 的时候加上 ":" modifier, 这样就不会受到@或@@的影响。

data a;
input sb : $11. p : $9. startdate : yymmdd10. enddate : yymmdd10.@;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;


当Formatted Input和@@一起用时,就会产生意外的结果:

data b;
input sb $11. p  $9. startdate  yymmdd10. enddate  yymmdd10.@@;
format startdate enddate yymmdd10.;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;

Log:

821  data b;
822  input sb $11. p  $9. startdate  yymmdd10. enddate  yymmdd10.@@;
823  format startdate enddate yymmdd10.;
824  cards;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.B has 12 observations and 4 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds

831  ;
832  run;



又如下面例子:

data c;
    input c $40. @@;
datalines;
1---shorter than 80---end
;


data c1;
    input c $40. @@;
datalines;
1---shorter than 80---end
2---longer than 80----------------------------------------------but shorter than 160---end
3---shorter than 80---end
4---shorter than 80---end
;


Log:

937  data c;
938      input c $40. @@;
939      datalines;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.C has 2 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds


941  ;
942  data c1;
943      input c $40. @@;
944      datalines;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.C1 has 14 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds

949  ;

初看程序,预计数据集C中会有1条记录,数据集C1中会有5条记录,而结果却不是这样。


个人猜测:当用datalines/cards读取数据时,
    1. SAS会在每一行的数据后加空格(或类似字符)知道80的倍数;
                Data c1; 数据步中,第一行会补到80个字符,第二行会补到160

    2. 下一行数据(补空格后)的长度不会小于上一行数据;
                 Data c1;数据步中,第三行虽然短于80,仍然补到了160个字符。


个人拙见,凭空猜测。查SAS帮助未果,望高手解惑!
二维码

扫码加我 拉你入群

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

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

2013-4-4 00:48:59
soporaeternus 发表于 2010-10-13 15:11
1个人觉得没必要用@,详细可见相关帮助
2 换个输入方式......
高手请教一下,如果是输入的只有年份呢,那数据input后面格式怎么写呢?谢谢啊!
二维码

扫码加我 拉你入群

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

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

2014-4-26 20:27:20
data a;
input a 11. p 9. startdate yymmdd10. enddate yymmdd10.;
datalines;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
proc print;
format startdate  enddate yymmddp10.;
run;
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群