这是【SAS正则表达式】系列的第五集。请在后台回复[SASRE]获取整个系列
改变形状和改变阴影| 5。呼叫PRXCHANGE()
0.回顾前一集
1.新问题
2.会见PRXCHANGE()
3.问题解决
0.回顾前一集:
如前所述,小王刚刚毕业,来到数码国际零售公司做数据分析师,帮产品部的妹子解决一个问题。下面是产品列表,有些行是产品名称,有些行是产品编号。现在只想保留数字(也就是红色字体部分),把数字分别放在括号里(括号里的数字代表产品类别),提取带有PD的logos(代表过期产品)。
(01)1872-8756
P1美发店
图书B13
(05)9212-0098
PD(05)9206-4571
舒硕手机
(12) 6753-5513
这里没有
PD(12)6434-4532
P&。洗涤
PC Pro4321S:(09) 1352-3154
小王的SAS代码如下:
数据生产;
if _ N _ = 1 then pattern = PRXPARSE("/(P?d?)((dd))?d { 4 }-d { 4 }/);
retainpattern
inputname $char40。;
lengthid $ 20
callPRXSUBSTR(模式、名称、开始、长度);
*以下PRXPOSN必须与此PRXMATCH一起使用;
match =PRXMATCH(模式,名称);
iflength GT 0thendo
*获取产品的完整ID;
id=substr(名称、开始、长度);
id=compress(id," ");
*获取ID中的产品类型(即括号中的数字);
callPRXPOSN(pattern,2,start_2,length _ 2);
category=substr(name,start_2,length _ 2);
*获取ID中产品的过期信息;
callPRXPOSN(pattern,1,start_1,length _ 1);
iflength _ 1 gt 0 then PD = substr(name,start_1,length _ 1);
输出;
结束;
keepid类别PD;
数据线;
(01)1872-8756
P1美发店
图书B13
(05)9212-0098
PD(05)9206-4571
Shushuophone
(12)6753-5513
这里没有
PD(12)6434-4532
P&。DWashing
PC Pro4321S:(09) 1352-3154
;
procprintnoobs
标题‘生产标识’;
跑步;
获得最终结果:
单击此处查看之前的剧集:
1.新问题
哎呀!
所有数字的后八位都是反的!
XXXX-YYYY,应该改为YYYY-XXXX
换句话说,你看到产品清单上的号码:(01)1872-8756
其实应该是:(01)8756-1872
怎么办?
放心,小王是用PRXCHANGES()函数换位置的。
2.第一次遇到PRXCHANGES()
该功能有两个功能:
1)任意字符的替换;
2)可以帮助我们自由重组一个段落,这是我们这一集要解决的问题。
前提是必须配合PRXPARSE使用。
1)更换
pattern = PRXPARSE(" s/Shu Shuo/帅帅/")
PRXCHANGE(模式、时间、字符串、新字符串、结果长度、截断值、更改次数)
看到很多参数不要觉得复杂。我用灰色标注的时候一般不用。
首先,PRXPARSE()语句与前一个有些不同,所以要注意用红色标注的部分。
正则表达式的开头有一个额外的s字母,用来指定替换或重排。在两个斜杠“//”之间,还有一个斜杠/(用红色标注),表示斜杠的左边是被替换的部分,右边是被替换的字符。在这个例子中,“舒硕”应该被替换为“帅帅”。
PACHANGE()的参数用法如下:
Pattern是前面PRXPARSE指定的正则表达式。
Times用于指定要替换的次数。如果设置为-1,则表示只要字符中有匹配,就会被替换。
String是要替换的字符,new_string是替换后的新字符串。
Result_length返回新字符的长度
truction-value返回0或1,指示新字符是否已被裁剪。如果新字符太长,它将被裁剪,即1。
Numer of changes返回匹配项替换了多少原始字符。
当然,不能生成新字符new_string,只能替换和修改原来的字符,例如:
pattern = PRXPARSE(" s/Shu Shuo/帅帅/")
PRXCHANGES(模式,-1,字符串)
2)重排
这很有趣。前面说过,“打包”就是把正则表达式的一部分封装起来,“打包”这段。在这里,我们可以重新排列部分:
pattern = PRXPARSE(" s/(Shu)(Shuo)/$ 2 $ 1/")
PRXCHANGE(模式、时间、字符串、新字符串、结果长度、截断值、更改次数)
变化主要在PRXPARSE,其中(shu)和(shu)分别用和包装和表示,其次是,这意味着它们以shuoshu的方式排列。我们来看看SAS。
datatemp
string= "我爱舒硕";
pattern = PRXPARSE(" s/(Shu)(Shuo)/$ 2 $ 1/";
callPRXCHANGE(模式,-1,字符串);
fileprint
put string =;
跑步;
输出结果是:
硕硕被重新安排到舒舒了!
3.问题解决
让我们重新排列之前分类的产品标识列表:
自我
(01)1872-8756
(05)9212-0098
PD(05)9206-4571
(12)6753-5513
PD(12)6434-4532
(09)1352-3154
将-前后四位数字,即1872-8756改为8756-1872等。SAS代码如下:
数据生产;
if _ N _ = 1 then pattern = PRXPARSE(" s/(P?d?(dd)?)(d { 4 })(-)(d { 4 })/$ 1 $ 4 $ 3 $ 2/";
retainpattern
inputid $char40。;
lengthnew_id 。;
callPRXCHANGE(pattern,-1,id,new_id,r_length,trunc,n _ of _ changes);
数据线;
(01)1872-8756
(05)9212-0098
PD(05)9206-4571
(12)6753-5513
PD(12)6434-4532
(09)1352-3154
;
procprintnoobs
标题‘生产标识’;
varid new _ id
跑步;
结果是:
让我们再次尝试将它集成到原始代码中。以下是我自己的代码,供您参考:
数据生产;
if _ N _ = 1then
pattern=PRXPARSE("s/(P?d?(dd)?)(d { 4 })(-)(d { 4 })/$ 1 $ 4 $ 3 $ 2/";
retainpattern
if _ N _ = 1 then pattern 2 = PRXPARSE("/P?d?(dd)?d { 4 }-d { 4 }/);
retainpattern2
inputname $char40。;
lengthnew_name 。;
lengthid $ 20
callPRXCHANGE(模式,-1,名称,new _ name);
callprxssubstr(pattern 2,new_name,start,length);
iflength gt 0thendo
id=substr(new_name,start,length);
id=compress(id," ");
输出;
结束;
数据线;
(01)1872-8756
P1美发店
图书B13
(05)9212-0098
PD(05)9206-4571
Shushuophone
(12)6753-5513
这里没有
PD(12)6434-4532
P&。DWashing
PC Pro4321S:(09) 1352-3154
;
procprintnoobs
标题‘生产标识’;
varname new _ name id
跑步;
SAS的结果是:
众所周知,正则表达式是文本分析的利器。有关文本分析和文本搜索,请参见:
做一个小游戏,你觉得这个系列的SAS正则表达式怎么样?
1.不好——跳到a。
2.好-跳到2.1
2.1奖励?
奖励——跳到b。
没有奖励-跳到2.2
2.2点击文章结尾的广告?
点击-跳到c
不要点击-跳转到a。
你有什么建议?可以在文末评论区留言,帮我做的越来越好!
b谢谢您,先生~!请在文章最后给我一个奖励。我会再接再厉!
c谢谢小哥哥,谢谢美女~!广告主会给我奖励的!
相关建议:
[SAS基础]
回复[sasbase]查看
IML公司(矩阵交互模块)
回复[sasiml]查看
1.关于数据分析的问题或者求助,直接在微信后台留言。
2.转载、投稿、发布免费招聘与合作,请添加个人微信AnselT,或邮箱:jiayounet@163.com。
3.查看完所有文章请在后台回复[M]
舒硕工作室
数据分析师主页|金融生物零售互联网
微信ID: shushujun
龙按下二维码去关注数字工作室
1.《移形换影 5. call PRXCHANGE | 移形换影》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《移形换影 5. call PRXCHANGE | 移形换影》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/878882.html