全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2532 11
2017-08-23
小弟刚注册没多久,还不太懂论坛发提问帖的规矩,如有不当之处请各位前辈多多包涵,这里先谢过了~~

这几个问题是我在工作中遇到的,虽然被我用自创的很愚蠢的方法解决了,但是我相信肯定有更加优化的解决方法。所以在这里提出来,请各位前辈大神指教,也希望能和像我一样的初学者一同讨论,共同进步。

问题一

这个恰巧是我今天刚刚遇到的,还很热乎

在不同长度的字符串中,如何以数字为标记进行分列。试举例如下:

业务方提供如下一列数据,为某商户名称+打折信息,如:(例子中商户名用一串无意义英文字母代替)

原数据

F1 F2
1   AABB75折优惠券
2   MNOP8折优惠券
3   SBS30元满减折扣
4   XYZMNOP50元返现活动
5   80RST9折活动
6   ASDFZXC消费立减活动
.........(共5000行)

我希望实现的效果是

F1 F2 F3
1   AABB   75折优惠券
2   MNOP   8折优惠券
3   SBS   30元满减折扣
4   XYZMNOP   50元返现活动
5   80RST   9折活动
6   ASDFZXC   消费立减活动
.......

实际情况中商户名称均为中文。

我的解决方法:因为商户名称中含有数字和整个字段不含数字的很少,把这一部分手动找出来,手动分列;
对于剩下的商户名+数字+一段话的字符串,用10个find()或者index()函数——因为数字只有0-9十种情况——找出出现每个数字的位置,然后选择在这段字符串中出现过的数字的最小的位置(即首次出现数字的位置),然后用这个位置做substr()。
这样做可以解决问题,但是显得很蠢,所以请教各位有没有更好的解决办法。

问题二

我手上有一个字符串,是爬取的一串商业地址。业务方提供了十个地名需要规避,如何比较快的解决这个问题。试举例如下:(中文地址仍用英文替代)

业务需要规避地址为 AA BB CC DD EE...
我有的字段为:
F1 F2
1   XXX省XXX市XXX街XXX路XXX小区X栋X号
2   XXX省XXX市XXX街XXX路XXX小区X栋X号
3   XXX省XXX市XXX街XXX路XXX小区X栋X号
......

只要F2列的字符串中出现了AA BB CC DD EE......的字样,我就删除这条观测。

我的解决方法:和问题一一样,很蠢地把所有情况写死,即
if find(F2,"AA") or find(F2,"BB") or find(F2,"CC") or ... or find(F2,"JJ") then delete;

想请问各位有没有什么更好的解决方法。

问题三:

我有一段宏,生成特定月份里的数据明细,宏简化如下:

%MACRO DATAS(yyyymmdd);
DATA WORK.RST_&yyyymmdd.;
statements;
RUN;
%MEND;

然而我需要使用这个宏生成近几年的结果文件,然后合并到一起。

我的解决方法:仍然,很蠢的写硬代码:
%DATAS(20140131);
%DATAS(20140228);
%DATAS(20140331);
......
%DATAS(20170630);

DATA WORK.ALL_FILE;
SET WORK.RST_20140131 WORK.RST_20140228 WORK.RST_20140331 ... WORK.RST_20170630;
RUN;

针对这种情况,有没有比较优化的解决方法?

后来我又想,可能输入年份需要判断闰年的问题,会比较麻烦,如果我简化一下,将宏参数设为1-10的数字,应该如何解决?
我试图用DO-LOOP循环,但是始终错误。
我的代码:

%MACRO DATAS(A);
statements;
%MEND;

DATA _NULL_;
do i=1 to 10;
%DATAS(i);
end;
RUN;

这个会报错,提示有未闭合的DO块,这个又是错在哪里?

三个问题,高手看来可能真的很愚蠢,但是却困扰我很久。还请各位看到的前辈不吝赐教。

再次感谢!
二维码

扫码加我 拉你入群

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

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

全部回复
2017-8-24 14:36:43
不懂帮顶
二维码

扫码加我 拉你入群

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

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

2017-8-24 15:56:25
第一个、第二个问题可以使用正则表达式,可以简化一些。第三个问题我建议写个宏程序执行do循环(也就是%do这种形式)。
二维码

扫码加我 拉你入群

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

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

2017-8-24 21:02:53
问题1:
data aa;
input F1 F2 $20.;
cards;
1 AABB75折优惠券
2 MNOP8折优惠券
3 SBS30元满减折扣
4 XYZMNOP50元返现活动
5 80RST9折活动
6 ASDFZXC消费立减活动
;
run;
data bb;
set aa;
pattern=prxparse("/[A-Z]+/");
retain pattern;
call prxsubstr(pattern,F2,start,length) ;
if start=1 then do;
content1=substr(F2,start,length);
content1=compress(content1," ");
content2=substr(F2,length+1);
output;end;
else do;content1=substr(F2,1,length+start-1);
content1=compress(content1," ");
content2=substr(F2,length+start);
output;end;
drop pattern start length F1;
run;
二维码

扫码加我 拉你入群

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

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

2017-8-24 21:18:01
复制代码
二维码

扫码加我 拉你入群

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

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

2017-8-24 21:22:44
chonfdsfwefw
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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