3. call PRXSUBSTR () | 庖丁解牛切割数据!

【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)

原文发表时间:2016-05-10

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏平凡文摘

国外大神总结的 10 个 Java 编程技巧!

13520
来自专栏王杰的专栏

最快速的视野管理算法

本文提出一种利用无序数组、双向链表、位标记进行视野管理的算法,可以将每次增、删、查视野列表的复杂度降为O(1)。

57940
来自专栏机器学习算法与Python学习

长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 原文 http://www.cnbl...

40150
来自专栏落花落雨不落叶

一个比较有意思的C语言问题

31370
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet 之 Bounce Setting

  又是一篇Sweet Snippet,自己看来都觉得过小,不足以成篇,不过自觉有些趣味,也就随便记一记了,权当自娱自乐 :)

7310
来自专栏take time, save time

你所能用到的数据结构(三)

三、对于效率提高的初次尝试     对于最自然的几种排序算法,数学家们开始思考如何提高排序算法的效率,可以通过数学证明出来如果想达到这个目的,必须想办法将相距...

29470
来自专栏精讲JAVA

面向对象VS面向过程

1 前言 向伟人致敬 其实这个问题真的是被问烂了,特别是刚入门的同行,我感觉这个问题应该是大家都听说过了,但是有多少人真的是理解这两个区别呢,这两...

21950
来自专栏专注研发

poj-1008-玛雅历

上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法...

19230
来自专栏java一日一条

由字符串反转(使用递归)引申出来一道Java面试题

如何面试一个从事编程工作的开发人员既困难又乏味,幸好还有很多值得参考的指南,比如:《Joel Guerilla Guide to interviewing》,...

9420
来自专栏CodeSheep的技术分享

函数式编程思维在三行代码情书中的应用

24950

扫码关注云+社区

领取腾讯云代金券