SAS中文论坛

标题: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢? [打印本页]

作者: shiyiming    时间: 2008-2-22 10:13
标题: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
我是个SAS初学者,有个数据导入的问题已经困扰我很久了,需要请教大家,万望指教:

[b:2qml6upq]1、任务:[/b:2qml6upq]把一个文本文件,导入到SAS;

[b:2qml6upq]2、文本文件格式:[/b:2qml6upq]各个数列都对齐排列:
     
   主要特点是每个数列的[b:2qml6upq][color=#FF0000:2qml6upq]开始位置都固定[/color:2qml6upq][/b:2qml6upq],但字段长度不一样——如下表[color=#0000FF:2qml6upq](可能论坛显示会不同,请见附件,或者可以copy至记事本,这样格式会正确)[/color:2qml6upq]:

2007-1-9 14:15:05    2007-1-10 11:33:26  G           2007-1-12 14:48:00   2007-1-12 14:48:00   999999   
2007-1-24 15:44:04   2007-1-29 14:02:48  G           2007-1-29 14:37:31   2007-1-29 14:37:31   999999   
2007-1-16 15:42:50   2007-1-17 15:03:38  G  232376   2007-1-21            2007-1-21 12:15:45   999999   
2007-12-27 17:13:38  2007-12-28 16:29:07 G           2007-12-28 17:04:23  2007-12-28 17:04:23  999999
2007-11-29 14:06:46  2007-12-3 10:37:44  G           2007-12-3 11:04:23   2007-12-3 11:04:23   999999

[b:2qml6upq]3、SAS数据集变量格式:[/b:2qml6upq]时间变量要求为datetime格式;

[b:2qml6upq]4、我的SAS版本:[/b:2qml6upq][color=#FF0000:2qml6upq]8.2[/color:2qml6upq]

[b:2qml6upq]5、问题:[/b:2qml6upq]已经搜索过论坛,大家都说应该是用 datetime20. 格式,可是我怎么也不成功。

[b:2qml6upq]6、子问题1:[/b:2qml6upq]首先datetime20.在SAS 8.2下可以运行吗?怎么运行?如下简单的用cards导入:
   
    我的失败程序:
   
    [color=#008000:2qml6upq] data temp;
       input datetime_sample datetime20.;
       format datetime_sample datetime20.;
       cards;
       2007-1-31 16:09:47
       2007-12-27 17:13:38
      run;[/color:2qml6upq]
  
    运行后,数据集的观测都为空值,提示错误如下:
     34   data temp;
     35   input datetime_sample datetime20.;
     36   format datetime_sample datetime20.;
     37   cards;

NOTE: Invalid data for datetime_sample in line 38 1-20.
RULE:      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
38         2007-1-31 16:09:47
datetime_sample=. _ERROR_=1 _N_=1
NOTE: Invalid data for datetime_sample in line 39 1-20.
39         2007-12-27 17:13:38
datetime_sample=. _ERROR_=1 _N_=2
NOTE: 数据集 WORK.TEMP 有 2 个观测和 1 个变量。


[b:2qml6upq]7、子问题2:[/b:2qml6upq]那个以上文本文档怎样导入SAS呢?

    我的失败程序(简单起见,导入前3列):

     [color=#008000:2qml6upq]data temp;
          infile "c:\样本数据.txt";
          input
          datetime_1 datetime20. 1-19
          datetime_2 datetime20. 22-40
          flag                   $42-42
          ;
     run;[/color:2qml6upq]


运行后,失败,提示错误如下:

62   data temp;
63   infile "c:\样本数据.txt";
64   input
NOTE: SCL 源行。
65   datetime_1 datetime20. 1-19
                            -
                            22
NOTE: SCL 源行。
66   datetime_2 datetime20. 22-40
                            --
                            22
ERROR 22-322: Expecting a name.

67   flag                   $42-42
68   ;
69   run;

NOTE: SAS 系统由于错误而停止该步的处理。
WARNING: 数据集 WORK.TEMP 可能不完整。在停止该步后有 0 个观测和 3 个变量。
WARNING: 数据集 WORK.TEMP 没有被替代,原因在于 该步停止了。
作者: shiyiming    时间: 2008-2-22 10:16
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
对不起,好像不能上传附件,只能重新编辑一下,大概是这样,希望能够表达清楚:

2007-1-9 14:15:05       2007-1-10 11:33:26    G              2007-1-12 14:48:00    2007-1-12 14:48:00    999999   
2007-1-24 15:44:04     2007-1-29 14:02:48    G              2007-1-29 14:37:31    2007-1-29 14:37:31    999999   
2007-1-16 15:42:50     2007-1-17 15:03:38    G  232376  2007-1-21                  2007-1-21 12:15:45    999999   
2007-12-27 17:13:38   2007-12-28 16:29:07  G               2007-12-28 17:04:23  2007-12-28 17:04:23  999999
2007-11-29 14:06:46   2007-12-3 10:37:44    G               2007-12-3 11:04:23   2007-12-3 11:04:23     999999
作者: shiyiming    时间: 2008-2-22 10:44
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
失败,好像格式还是不一样,只能麻烦大家移步:
<!-- m --><a class="postlink" href="http://sasor.feoh.net/modules.php?name=Forums&amp;file=viewtopic&amp;p=18096&amp;sid=3ee93a3bc988939761e9aa2dd0da8eac#18096">http://sasor.feoh.net/modules.php?name= ... 8eac#18096</a><!-- m -->
作者: shiyiming    时间: 2008-2-22 14:03
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
sas的帮助中,datetime的informat中的date部分只能是ddmmmyy或ddmmmyyyy的格式,其中mmm是每个月的前三个字母.
所以你的读入不对.对于你的例子,可以这样解决:
data temp;
input date yymmdd10. time time10.;
datetime=date*24*3600+time;
format datetime datetime20.;
cards;
2007/1/31 16:09:47
2007/12/27 17:13:38
run;
proc print data=temp;run;
看这样满足你的要求不?
作者: shiyiming    时间: 2008-2-22 14:39
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
对于你说的文本读入的问题,要先把文件日期中的‘-’改成‘/’;
我直接读入的时候还是有点问题,出个笨主意:
data temp;
infile &quot;&quot;;
retain datetime1 datetime2 var5 datetime3 datetime4 var10;
length var1-var10 $10.;
input var1-var10;
datetime1=input(var1,yymmdd10.)*24*3600+input(var2,time10.);
datetime2=input(var3,yymmdd10.)*24*3600+input(var4,time10.);
datetime3=input(var6,yymmdd10.)*24*3600+input(var7,time10.);
datetime4=input(var8,yymmdd10.)*24*3600+input(var9,time10.);
format datetime1-datetime4 datetime20.;
keep datetime1-datetime4 var5 var10;
run;
proc print data=temp;run;
作者: shiyiming    时间: 2008-2-22 14:53
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
真是神速呢。多谢,我试试看先。
作者: shiyiming    时间: 2008-2-22 15:59
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
还是有问题。因为有些字段是缺失,按照您的代码运行后,第3行的数据自var6开始就是错误的了。

比如数据的第3行的,值为“232376”那个字段在其他行是缺失的;而第3行同样缺失了一个时间字段:
(仅仅为了显示方便,我把空格换成*号)

2007-1-9*14:15:05******2007-1-10*11:33:26***G**************2007-1-12*14:48:00***2007-1-12*14:48:00*****999999   
2007-1-24*15:44:04*****2007-1-29*14:02:48***G**************2007-1-29*14:37:31***2007-1-29*14:37:31*****999999   
2007-1-16*15:42:50*****2007-1-17*15:03:38***G**232376***2007-1-21***************2007-1-21*12:15:45*****999999
作者: shiyiming    时间: 2008-2-22 16:26
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
缺失的地方你得特殊处理一下,比如用N/A标记下,不然的话,估计是没有办法读出来的
作者: shiyiming    时间: 2008-2-22 16:42
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
[code:32b9hbeb]

data a;
infile datalines missover ;
input (var1-var5) (&#58;$10&#46;) @45 var6 $8&#46;  var7 &#58;$10&#46; @64 var8 $10&#46; (var9 var10 var11) (&#58;$10&#46;)  ;
dtime1=input(put(input(var1,yymmdd10&#46;),date9&#46;)||' '||put(input(var2,time8&#46;),time8&#46;),datetime20&#46;);
dtime2=input(put(input(var3,yymmdd10&#46;),date9&#46;)||' '||put(input(var4,time8&#46;),time8&#46;),datetime20&#46;);
dtime3=input(put(input(var7,yymmdd10&#46;),date9&#46;)||' '||put(input(var8,time8&#46;),time8&#46;),datetime20&#46;);
dtime4=input(put(input(var9,yymmdd10&#46;),date9&#46;)||' '||put(input(var10,time8&#46;),time8&#46;),datetime20&#46;);
format dtime1-dtime4 datetime20&#46;;
cards;
2007-1-9 14&#58;15&#58;05    2007-1-10 11&#58;33&#58;26  G           2007-1-12 14&#58;48&#58;00   2007-1-12 14&#58;48&#58;00   999999   
2007-1-24 15&#58;44&#58;04   2007-1-29 14&#58;02&#58;48  G           2007-1-29 14&#58;37&#58;31   2007-1-29 14&#58;37&#58;31   999999   
2007-1-16 15&#58;42&#58;50   2007-1-17 15&#58;03&#58;38  G  232376   2007-1-21            2007-1-21 12&#58;15&#58;45   999999   
2007-12-27 17&#58;13&#58;38  2007-12-28 16&#58;29&#58;07 G           2007-12-28 17&#58;04&#58;23  2007-12-28 17&#58;04&#58;23  999999
2007-11-29 14&#58;06&#58;46  2007-12-3 10&#58;37&#58;44  G           2007-12-3 11&#58;04&#58;23   2007-12-3 11&#58;04&#58;23   999999
;
proc print;run;

[/code:32b9hbeb]
作者: shiyiming    时间: 2008-2-25 10:12
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
Date and Time Expression****SAS Datetime Informat  
30May2000:10:03:17.2********DATETIME20.
30May00 10:03:17.2***********DATETIME18.
30May2000/10:03**************DATETIME15.

这是datetimew.的三种格式,对比一下你的日期格式就应该知道问题在哪了
作者: shiyiming    时间: 2008-2-25 11:17
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
真的非常感谢各位。尤其是waterlwh:他(她)的代码非常好用。只是稍微有些bug,做了如下更改(红色部分):
[color=#00BF00:34i5jtcn]data a;
    infile datalines missover ;
    input (var1-var5) (:$10.) @45 var6 $8.  var7 :$10. @64 var8 $10. (var9 var10 var11) (:$10.)  ;[/color:34i5jtcn]
    [color=#FF0000:34i5jtcn]if var8=&quot;&quot; then var8=&quot;00:00:00&quot;;[/color:34i5jtcn]
    [color=#00BF00:34i5jtcn]dtime1=input(put(input(var1,yymmdd10.),date9.)||' '||put(input(var2,time8.),time8.),datetime20.);
    dtime2=input(put(input(var3,yymmdd10.),date9.)||' '||put(input(var4,time8.),time8.),datetime20.);
    dtime3=input(put(input(var7,yymmdd10.),date9.)||' '||put(input(var8,time8.),time8.),datetime20.);
    dtime4=input(put(input(var9,yymmdd10.),date9.)||' '||put(input(var10,time8.),time8.),datetime20.);
    format dtime1-dtime4 datetime20.;
    cards;
    2007-1-9 14:15:05    2007-1-10 11:33:26  G           2007-1-12 14:48:00   2007-1-12 14:48:00   999999   
    2007-1-24 15:44:04   2007-1-29 14:02:48  G           2007-1-29 14:37:31   2007-1-29 14:37:31   999999   
    2007-1-16 15:42:50   2007-1-17 15:03:38  G  232376   2007-1-21            2007-1-21 12:15:45   999999   
    2007-12-27 17:13:38  2007-12-28 16:29:07 G           2007-12-28 17:04:23  2007-12-28 17:04:23  999999
    2007-11-29 14:06:46  2007-12-3 10:37:44  G           2007-12-3 11:04:23   2007-12-3 11:04:23   999999
    ;
    proc print;run;[/color:34i5jtcn]
作者: shiyiming    时间: 2008-2-25 11:23
标题: to tianwild
真的非常感谢你的答复。不过我以为SAS倒是考虑可以增加对我上传的这种日期时间格式的支持——其实,我的这个TXT文档是从某一个SQL数据库中导出的,我以为这种格式会比较常见——我能拿到的只能是这种数据格式了,只能用SAS去硬生生凑它。
作者: shiyiming    时间: 2008-2-25 12:02
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
你好webber,作为探讨,时间为空值并不一定表示是00:00:00,不过奇怪的是sql中的日期格式是datetime格式,为什么文本文件中相应的时间变量会出现空值
作者: shiyiming    时间: 2008-2-25 12:23
标题: to waterlwh
出现空值的原因不是很清楚。只能从入SQL库的流程上猜测:可能的原因是那行数据是后来补充、更新到数据库的。

还好,那个变量对时间的精确性不是很敏感,用00:00:00代替还是能够使用的。
作者: shiyiming    时间: 2008-2-25 18:42
标题: Re: 【问题】文本数据导入SAS,datetime20.格式怎么老是失败呢?
没有太多时间尝试:是否也可以考虑自定义informat来实现? <!-- m --><a class="postlink" href="http://support.sas.com/kb/6/743.html">http://support.sas.com/kb/6/743.html</a><!-- m -->




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2