全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7745 7
2011-07-27
原始数据在EXCEL里,第一列是变量string,第二列是变量date;如何将其从单元格分离出来并在SAS DATASET中string和date能够对应显示?在原始数据中变量string的特点是不同的string之间由一个空行分割。
原始数据如下:
BCDSH MDCS



VDC DCCSal TeCS - CSSDn


BCSDd LaSCh CSDCl - CSDical and user CDS



DCSD SDC / Pre-CSDC (CDSCCSDC bCSDC)
2/1/2011

9/1/2010

11/15/2010

1/25/2011

期望得到的SAS DATASET如下:
BCDSH MDCS2/1/2011
VDC DCCSal TeCS - CSSDn
9/1/2010
BCSDd LaSCh CSDCl - CSDical and user CDS11/15/2010
DCSD SDC / Pre-CSDC (CDSCCSDC bCSDC)
1/25/2011
二维码

扫码加我 拉你入群

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

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

全部回复
2011-7-27 15:56:39
复制代码
提供一个思路,试下来那个分隔符是换行符而非回车符,即16进制为0A。
x和y会取值不一样,以LZ例为12 vs 8
但是用在do循环中结果相同。我估计是因为If there are two or more contiguous delimiters, SCAN treats them as one.——SAS HELP
对于有缺失值数据,该程序失效!
二维码

扫码加我 拉你入群

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

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

2011-7-27 15:57:53
加一个日志,应该是这样,需要精细化,严谨化......
145  proc import datafile="e:\1.xls" out=a replace;
146      getnames=no;
147  run;

NOTE: .A was successfully created.
NOTE: “PROCEDURE IMPORT”所用时间(总处理时间):
      实际时间         0.34 秒
      CPU 时间         0.21 秒


147!     quit;
148
149  data _null_;
150      set a;
151      put f1 f2;
152      x=count(compress(f1),"0A"x);
153      y=count(compress(f2),"0A"x);
154      put x y;
155      do i=1 to
156          x
157  /*      y*/
158          ;
159          str1=scan(f1,i,"0A"x);
160          str2=scan(f2,i,"0A"x);
161          put str1 str2;
162      end;
163  run;

BCDSH MDCS



VDC DCCSal TeCS - CSSDn


BCSDd LaSCh CSDCl - CSDical and user CDS



DCSD SDC
/ Pre-CSDC (CDSCCSDC bCSDC)
2/1/2011

9/1/2010

11/15/2010

1/25/2011


12 8
BCDSH MDCS 2/1/2011
VDC DCCSal TeCS - CSSDn 9/1/2010
BCSDd LaSCh CSDCl - CSDical and user CDS 11/15/2010
DCSD SDC / Pre-CSDC (CDSCCSDC bCSDC) 1/25/2011




NOTE: 从数据集 WORK.A 读取了 1 个观测。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         0.00 秒
      CPU 时间         0.00 秒
二维码

扫码加我 拉你入群

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

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

2011-7-27 16:05:17
** 只适用与string和date成对出现时;

proc import datafile="c:\files\test.xls" out=test dbms=excel replace;
   getnames=no;
   delimiter='0A'x;
run;

data test1;
    merge test(keep=f1 rename=(f1=string) where=(^missing(string)))
          test(keep=f2 rename=(f2=date) where=(^missing(date)));
run;
二维码

扫码加我 拉你入群

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

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

2011-7-27 16:17:16
4# pobel
赞的用法
也查到了DELIMITER的用法

但是为什么我这边会有如下错误,可能小白了,望指教......

5    proc import datafile="e:\1.xls" out=test dbms=excel replace;
NOTE: 上一个语句已删除。
6       getnames=no;
7       delimiter='0A'x;
        ---------
        180
ERROR 180-322: 语句无效或未按正确顺序使用。
8    run;

NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “PROCEDURE IMPORT”所用时间(总处理时间):
      实际时间         0.01 秒
      CPU 时间         0.01 秒
二维码

扫码加我 拉你入群

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

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

2011-7-27 16:25:27
soporaeternus 发表于 2011-7-27 16:17
4# pobel
赞的用法
也查到了DELIMITER的用法

但是为什么我这边会有如下错误,可能小白了,望指教......

5    proc import datafile="e:\1.xls" out=test dbms=excel replace;
NOTE: 上一个语句已删除。
6       getnames=no;
7       delimiter='0A'x;
        ---------
        180
ERROR 180-322: 语句无效或未按正确顺序使用。
8    run;

NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “PROCEDURE IMPORT”所用时间(总处理时间):
      实际时间         0.01 秒
      CPU 时间         0.01 秒
我也试了delimiter,同样无果。
猜测是不是不适用于dbms=excel。
等待高手指教。。。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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