庖丁解牛切割数据!| 【SAS Says·扩展篇】

【SAS Says·扩展篇】庖丁解牛割数据! | 3. call PRXSUBSTR ()

0. 前集回顾

1. 新的问题

2. 初识 PRXSUBSTR()

3. 问题解决


0. 前集回顾:

刚毕业的小王来到一家零售公司的数据部门做一名分析师,上班的第一天,产品部的妹子就找他来解决一个问题:

数据库中有一份长长的产品名单,名单中有的是产品的名字,有的是产品的编号,产品部的妹子只想要产品的编号的那些行(下图红色字体的),以做更深一步的分析。

(01)1872-8756 Body shop P1 Book B13 (05)9212-0098 PD(05)9206-4571 Shushuophone (12) 6753-5513 None here PD(12)6434-4532 P&DWashing ......(未显示完)

红色字体的编号似乎看起来没有什么容易把握的规律:占位符不一样、也不全都是数字、有的行的括号后面还有空格等等,小王利用正则表达式,一分钟不到就解决了。

a=PRXMATCH("/\(\d\d\) ?\d{4}-\d{4}/", name); if a GT 0 then output;

这是第一集的内容:

我们也可以用PRXPARSE()先将正则表达式存起来:

pattern=PRXPARSE("/\(\d\d\) ?\d{4}-\d{4}/") a=PRXMATCH(pattern, name); if a GT 0 then output;

这是第二集的内容:

提取的结果如下:

1. 新的问题

产品部门的妹子发现了一个新问题:

PC Pro4321S: (09) 1352-3154

这一行产品的名字和产品编号混在了一起,以前的代码可以将这行整行都留下来,但是,产品部的妹子表示,她希望可以把名字给屏蔽掉,只保留编号

好吧,我们的处理方式可能要变一下,现在我们的产品名单中,就多了一行:

(01)1872-8756 Body shop P1 Book B13 (05)9212-0098 PD(05)9206-4571 Shushuo phone (12) 6753-5513 None here PD(12)6434-4532 P&D Washing PC Pro4321S: (09) 1352-3154

我们要留下红色字体的行,因为他们包含了产品编号,并且还要把,非编号的部分去掉,比如最后一行的PC Pro4321S:部分。

这里咱们推荐使用PRXSUBSTR+substr组合的方式。

2. 初识PRXSUBSTR()

这个函数用来获取一段特定字符在一句话中的详细位置:开头、结尾、占位长度,它的格式为:

Call PRXSUBSTR( pattern-id,string, start, <length> )

  • 用call语句来调用这个函数。
  • 这里的正则表达式只能用pattern-id的方法了(见第二集)。
  • 语句将返回两个参数:start开始位置、length字符长度。

这样,我们就获取了pattern-id在string里的起始位置、长度,然后再用substr()就可以在string中只提取出正则表达式的内容。

先看一个简单的例子:

下面有两句话:

String1=”Shushuo jun I love uvery much !” String2=”Jack Ma I love u verymuch !”

提取出“Shushuo jun”,如果有的话就提取出来,如果没有的话就什么都不提取。实现代码如下:

data_null_; string1="Shushuo jun I love u very much!"; string2="Jack Ma I love u very much !"; *提取出string里的Shushuojun; pattern=PRXPARSE('/Shushuo jun/'); call PRXSUBSTR(pattern, string1, start1,length1); call PRXSUBSTR(pattern, string2, start2,length2); a=substr(string1,start1, length1); b=substr(string2,start2, length2); fileprint; put a= b=; run;

输出结果为:

3. 问题解决

现在,想一下开头的那个问题,我们现在只需要将产品编号提取出来。

data production; if _N_=1then pattern=PRXPARSE("/P?D?\(\d\d\) ?\d{4}-\d{4}/"); retain pattern; input name $char40.; length id $ 20; call PRXSUBSTR(pattern,name,start,length); if length GT 0thendo; id=substr(name,start,length); output; end; keep id; datalines; (01)1872-8756 Body shop P1 Book B13 (05)9212-0098 PD(05)9206-4571 Shushuophone (12)6753-5513 None here PD(12)6434-4532 P&DWashing PC Pro4321S:(09) 1352-3154 ; procprintnoobs; title'Production ID'; var id; run;

输出结果为:

任务完成了。


等一等,产品部的妹子说:

“有的编号里,括号后面带空格,你也给提取出来了,太感谢你了,干脆好人做到底,再帮我把编号里的这个空格去掉吧~”

“我ci~ao~”

好吧,这个问题其实也非常的简单,只需要在这段代码

if length GT 0thendo; id=substr(name,start,length); output; 的output前面加一句:id=compress(id, “ ”);

就可以了。

原文发布于微信公众号 - 数说工作室(shushuojun)

原文发表时间:2015-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

[每日一题]日期转换

品完了前面的鸡汤,今天就干了这题 题目描述 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 输入 年月日 输出 当年第几天 样...

34260
来自专栏C语言及其他语言

【每日一题】尼科彻斯定理

题目描述 验证尼科彻斯定理,即:任何一个正整数的立方都可以写成一串连续奇数的和。 输入 任一正整数 输出 该数的立方分解为一串连续奇数的和 样例输入 13 样例...

34790
来自专栏老秦求学

算法三之归并排序

快速排序,应用到分治法。 下面先了解一下什么是分治法? 分治法,顾名思义,分而治之。先将问题进行分解,然后将分离的问题进行求解,最后将所有分离的解进行合并,得到...

364130
来自专栏java一日一条

如何拿到半数面试公司Offer——我的Python求职之路

从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python...

10510
来自专栏Albert陈凯

函数式编程初探

http://www.ruanyifeng.com/blog/2012/04/functional_programming.html 诞生50多年之后,函数式编...

370100
来自专栏机器学习AI算法工程

新手学python 如何求职拿offer?

从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python...

51760
来自专栏菩提树下的杨过

ruby学习笔记(4)-动态修改类的属性

动态语言之所以“动态”,最明显的特征就是:类实例的行为/属性可以在new出后,动态修改!个人觉得这种处理相对java/c#(静态语言)来说,更符合现实世界。 ...

22870
来自专栏HTML5学堂

只有JS基础扎实的攻城狮,才解得出的“密码”

HTML5学堂-码匠:虽然很不想面对,但是明天,的确是节后工作的开始,今天就一边解密一边“适应”一下代码吧! Tips:如下的四道题目,是基于几家公司的面试真题...

411100
来自专栏机器人网

电气技术中的文字符号和项目代号

一个电气系统或一种电气设备通常都是由各种基本件、部件、组件等组成,为了在电气图上或其他技术文件中表示这些基本件、部件、组件,除了采用各种图形符号外,还须标注一些...

33860
来自专栏Fundebug

你试过不用if撸代码吗?

译者按: 试着不用if撸代码,是件很有趣的事,而且,万一你领会了什么是“数据即代码,代码即数据”呢?

16350

扫码关注云+社区

领取腾讯云代金券