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

在不同长度的字符串中,如何以数字为标记进行分列。试举例如下:
业务方提供如下一列数据,为某商户名称+打折信息,如:(例子中商户名用一串无意义英文字母代替)
原数据
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块,这个又是错在哪里?
三个问题,高手看来可能真的很愚蠢,但是却困扰我很久。还请各位看到的前辈不吝赐教。
再次感谢!



雷达卡






京公网安备 11010802022788号







