楼主: tj0412ymy
7786 7

[原创博文] 请教高手SAS中Split string 的疑难问题 [推广有奖]

  • 2关注
  • 48粉丝

已卖:4314份资源

副教授

65%

还不是VIP/贵宾

-

威望
0
论坛币
11512 个
通用积分
12.7575
学术水平
72 点
热心指数
91 点
信用等级
64 点
经验
29292 点
帖子
545
精华
0
在线时间
1203 小时
注册时间
2009-3-10
最后登录
2024-2-15

楼主
tj0412ymy 发表于 2011-7-27 14:53:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
原始数据在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
二维码

扫码加我 拉你入群

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

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

关键词:string tring split 疑难问题 RING EXCEL 如何

本帖被以下文库推荐

沙发
soporaeternus 发表于 2011-7-27 15:56:39
  1. proc import datafile="e:\1.xls" out=a replace;
  2.         getnames=no;
  3. run;quit;

  4. data _null_;
  5.         set a;
  6.         put f1 f2;
  7.         x=count(compress(f1),"0A"x);
  8.         y=count(compress(f2),"0A"x);
  9.         put x y;
  10.         do i=1 to
  11.                 x
  12. /*                y*/
  13.                 ;
  14.                 str1=scan(f1,i,"0A"x);
  15.                 str2=scan(f2,i,"0A"x);
  16.                 put str1 str2;
  17.         end;
  18. run;
复制代码
提供一个思路,试下来那个分隔符是换行符而非回车符,即16进制为0A。
x和y会取值不一样,以LZ例为12 vs 8
但是用在do循环中结果相同。我估计是因为If there are two or more contiguous delimiters, SCAN treats them as one.——SAS HELP
对于有缺失值数据,该程序失效!
Let them be hard, but never unjust

藤椅
soporaeternus 发表于 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 秒
Let them be hard, but never unjust

板凳
pobel 在职认证  发表于 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;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
soporaeternus + 1 + 1 + 1 赞的!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

和谐拯救危机

报纸
soporaeternus 发表于 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 秒
Let them be hard, but never unjust

地板
pobel 在职认证  发表于 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。
等待高手指教。。。
和谐拯救危机

7
soporaeternus 发表于 2011-7-27 16:41:37
DELIMITER='char' | 'nn'x; for a delimited external file, specifies the delimiter that separates columns of data in the input file......

OH My Lady GAGA......
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 + 1 亮点是"separate columns of data"

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Let them be hard, but never unjust

8
tj0412ymy 发表于 2011-7-28 19:47:03
soporaeternus 发表于 2011-7-27 15:56
  1. proc import datafile="e:\1.xls" out=a replace;
  2.         getnames=no;
  3. run;quit;
  4. data _null_;
  5.         set a;
  6.         put f1 f2;
  7.         x=count(compress(f1),"0A"x);
  8.         y=count(compress(f2),"0A"x);
  9.         put x y;
  10.         do i=1 to
  11.                 x
  12. /*                y*/
  13.                 ;
  14.                 str1=scan(f1,i,"0A"x);
  15.                 str2=scan(f2,i,"0A"x);
  16.                 put str1 str2;
  17.         end;
  18. run;
复制代码
提供一个思路,试下来那个分隔符是换行符而非回车符,即16进制为0A。
x和y会取值不一样,以LZ例为12 vs 8
但是用在do循环中结果相同。我估计是因为If there are two or more contiguous delimiters, SCAN treats them as one.——SAS HELP
对于有缺失值数据,该程序失效!
非常感谢热心解答!但不同的String之间所含的"0A"x字符的个数有时不止一个,甚至所有String的末尾也含有这种字符,故将修改后的程序予以共享:

  1. proc import datafile="e:\1.xls" out=a replace;
  2.         getnames=no;
  3. run;quit;
  4. proc sort data=a;
  5. by Project_Name;
  6. run;

  7. data bb;
  8.         set a;
  9. length str $255. strd $255.;
  10. retain str strd;
  11. by  Project_Name;
  12. if first.Project_Name then do; str=' '; strd=' '; end;
  13.         x=count(compress(f1),"0A"x);
  14.         y=count(compress(f2),"0A"x);
  15.        do j=1 to x+2;
  16.        str0= scan(f1,j,"0A"x);
  17.     if str0 NE NONE then
  18.     str=cats(str,'@',str0);
  19.     end;
  20.            do k=1 to y;
  21.        strd0= scan(f2,k,"0A"x);
  22.     if strd0 NE NONE then
  23.     strd=cats(strd,'@',strd0);
  24.     end;
  25.         do i=1 to  y ;
  26.                 str1=scan(str,i,'@');
  27. /*                if str1 NE NONE THEN*/
  28.                 str2=scan(strd,i,'@');*ELSE STR2=' '; output;
  29.         end;
  30. run;
复制代码

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-20 11:45