撕数据! |【SAS Says·扩展篇】

【SAS Says·扩展篇】撕数据! | 4. call PRXPOSN()

0. 前集回顾

1. 新的问题

2. 初识 PRXPOSN()

3. 问题解决


0. 前集回顾:

小王刚刚毕业,来到数说国际零售公司任数据分析师,产品部的妹子求助他,希望可以帮忙做这么一件事:下面是一份产品名单,有的行是产品的名字,有的行是产品的编号,现在只想将编号保留下来(即红色字体的部分),尤其是最后一行,这一行只要一部分。

(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

小王写了一段代码,很快就搞定了:

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;

输出结果为:

这个问题真是圆满的解决了。

点击这里回顾:


1. 新的问题

不错,一个新的问题来了,

”括号里面的数字代表了产品的类别,能不能将它单独提出来?“

当然,你可以在目前的表的基础上,用excel处理,比如:

If 第一个字符是”(” then 提取后面两个数字

If 第一个字符是”P” then 提取后面第四、第五个数字

当然这也一点都不酷,而且如果名单的后面有其他变动,比如前面的PD被错拼成BD了、或者真有一个前缀是BD呢?

还是用正则表达式一次性搞定吧!这就要引出我们今天的主角——PRXSON!

2. 初识PRXPOSN()

这个语句要配合PAXMATCH(或其他PRX搜索函数)使用。需要三步:

在正则表达式中,用括号()将需要提取的一小部分括起来,我自己称之为“打包”,比如,在产品编号的例子中,我们需要打包括号里的两位数字,那么我们就在正则表达式中将这两个\d\d括起来:

“/P?D?\((\d\d)\) ?\d{4}-\d{4}/”

并放入pattern中:

Pattern=PRXPARSE(“/P?D?\((\d\d)\) ?\d{4}-\d{4}/”)

用PRXMATCH匹配这段正则表达式

PAXMATCH(pattern,name)

用PRXPOSN函数得到产品编号(就是括号里,我们要提取的那个)的起始位置和长度。

CALLPRXPOSN(pattern, 1, start, length)

重点来了,PRXPOSN的格式为:

Call PRXPOSN(pattern-id, 区块编号, start, length)

这里pattern-id是正则表达式,区块编号就是正则表达式中,我们打包起来的。只打包一个,那么编号就是1,打包两个,那么可以选择1或者2。

然后,这个函数就把区块的起始位置和长度赋给了start和length。

用substr()函数将区块抓下来

本例中,产品类型就是:

Category=Substr(name,start, length)

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); *下面的PRXPOSN必须要配合这个PRXMATCH使用; match =PRXMATCH(pattern, name); if length GT 0thendo; *得到产品ID; id=substr(name,start,length); id=compress(id," "); *得到ID中的产品类型(即括号里面的数字); call PRXPOSN(pattern, 1, start_1, length_1); category=substr(name, start_1, length_1); output; end; keep id category; 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 category; run;

最后的结果为:

趁热,咱们再加一列吧,标识出哪些产品是过期的,即PD。

直接上代码,非常简单,大家自己研究研究吧:

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); *下面的PRXPOSN必须要配合这个PRXMATCH使用; match =PRXMATCH(pattern, name); if length GT 0thendo; *得到产品整个ID; id=substr(name,start,length); id=compress(id," "); *得到ID中的产品类型(即括号里面的数字); call PRXPOSN(pattern, 2, start_2, length_2); category=substr(name, start_2, length_2); *得到ID中产品的过期信息; call PRXPOSN(pattern, 1, start_1, length_1); if length_1 gt 0then pd= substr(name, start_1, length_1); output; end; keep id category pd; 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'; run;

结果为:


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

原文发表时间:2016-01-13

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AzMark

Python字符串、循环及练习

27540
来自专栏java一日一条

Java函数式开发——优雅的Optional空指针处理

空闲时会抽空学习同在jvm上运行的Groovy和Scala,发现他们对null的处理比早期版本Java慎重很多。在Java8中,Optional为函数式编程的n...

26110
来自专栏Phoenix的Android之旅

什么是策略模式

策略模式应该是Java设计模式中最简单的一种模式, 它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑。

10430
来自专栏哈雷彗星撞地球

设计模式简介

设计模式(Design pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式代表了最佳的实践,通常被有经验的面向对...

10340
来自专栏C语言C++游戏编程

新手入门C语言编程:使用函数必须知道的三点注意事项!

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

14520
来自专栏desperate633

面向对象的 6 个基本原则

一个类只做它该做的事情。 是指一个类的功能要单一, 一个类只负责一个职责。 一个类只做它该做的事情(高内聚)。 在面向对象中, 如果只让一个类完成它该做的事,...

9620
来自专栏小文博客

蓝桥杯 C语言省赛 习题1 奖券数目

19620
来自专栏GopherCoder

『No25: 编写可读代码的艺术(2)』

根据:先处理正向逻辑,处理简单的,处理可疑或者有趣的准则,改善如下(仅仅只是调换顺序)

12420
来自专栏CDA数据分析师

震惊小伙伴的Python单行代码

几年前,函数式编程的复兴正值巅峰,一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地,一系列使用其他语言实现这些单行代码的文章也随之出现,...

23870
来自专栏编程之旅

《Clean Code》 读书小节(二)

之前在看了《Clean Code》这本书的前两章时,就写下了第一篇读书小节,而随着读书的深入,便决定再总结一下后面一部分的读书心得。

9030

扫码关注云+社区

领取腾讯云代金券