SAS PRX请提取子串

时间:2012-12-13 15:01:34

标签: regex sas

我正在尝试使用SAS PRX功能从我的数据集中提取子字符串。但它只返回完全匹配,而我需要它更灵活,并提取符合各种条件的那些。

我在下面复制了我的数据。如您所见,我的数据中的一个变量是“brandmodel”,其中包含品牌名称和特定相机的型号#。我需要为模型#s单独创建一个列。所以我使用PRX函数来提取它们,因为它们通常遵循以下模式之一:

例如:JX100或JX10或JX1(即1-2个字母,紧接着1-3个数字。这个我的程序(复制到数据下面)可以处理。但是我遇到的问题是:如何提取那些字母#的字母与数字之间的空格或连字符分开,我如何将它们提取到与“模型”完全相同的列中?同时,一些观察没有模型# s,我怎样才能将它们设置为缺失而不是完全丢弃?

Brandmodel|Price

iTwist F124 Digital Camera -red|49.00
Vivitar IF045 Digital Camera -Blue|72.83
Liquid Image Underwater Camera Mask|128.00
Impact Series Video Camera MX Gogglesâ„¢|188.00
Olympus VR 340  Silver|148.00
Olympus TG820 Digital Camera Black|278.00
Olympus VR 340 16MP 10x 3.0 LCD Red|148.00
Vivitar VX137-Pur Digital Camera|39.00

Olympus SZ-12 Digital Camera -Black|198.00
Olympus VG160 Digital Camera Red|98.00
Olympus VR340   Purple|148.00
Olympus TG820 Digital Camera Silver|298.00
Olympus TG820 Digital Camera Blue|278.00
Olympus VG160 Digital Camera    Orange|98.00
Olympus TG820 Digital Camera Red|298.00
Fujifilm FinePix AX500 Red|78.63
Canon A2300 Silver|98.63
Canon A810 Red|75.00
Nikon Coolpix S2600 Digital Camera - Red|88.00
Nikon Coolpix L25 Digital Camera - Silver|82.00
Casio Exilim ZS10BK|128.00

Olympus TG-310 14 MP blue Digital Camera|148.00
Hipstreet Kidz Digital Camera - Blue|14.93
Casio Exilim ZS10PK|128.00
Olympus TG-310 14 MP Digital Camera orange|148.00

SAS计划

data walnov21p2; 
 length brandmodel $ 80;
 infile "G:\File2\data\store_nov21\storenv21p2.csv" firstobs=2 dlm="|" dsd;
 input brandmodel price;
 re= prxparse('/[[:alpha:]]{1,3} \d{1,4}/');
 if prxmatch(re, brandmodel) then
 do;
   model=prxposn(re, 0, brandmodel);
   output;
 end;
run;

2 个答案:

答案 0 :(得分:2)

对于你的最后一个问题(将变量设置为缺失而不是删除观察,请在结尾处从条件output中删除do语句。只需将其更改为:

if prxmatch(re, brandmodel) then model=prxposn(re, 0, brandmodel);

无论是否定义了模型,这都将导致输出所有观察结果。

对于你的其余问题,它实际上是关于与Perl正则表达式的模式匹配,并不是特定于SAS。它也很棘手,因为有些模型中有空格。尝试发布一个不同的问题,询问与您想要的匹配的Perl正则表达式(带有那些标记)。

另外,发布一些你想要输出的例子。例如,您对此类输入的期望是什么:

Olympus VR 340 16MP 10x 3.0 LCD Red|148.00 
Vivitar VX137-Pur Digital Camera|39.00

答案 1 :(得分:1)

你可以使用的一种方法是建立一个制作字典(尼康,奥林巴斯等)并使用它来删除字符串中的品牌;那你有 Olympus VR 340 16MP 10x 3.0 LCD Red - > VR 340 16MP...更容易解析。

但最终,这可能是正则表达式无法解决的问题,因为正则表达式无法轻易解析所有可能的情况(“Nikon Coolpix”是一个品牌,还是“Coolpix S2600”的模型?)。对于这类事情的最佳解决方案是制作“大部分时间”正则表达式,例如

/[a-zA-Z]{1,3}[ -]?[\d]{1,4}/

然后编写不匹配的代码以转到单独的数据集,您可以手动查看它们并对其进行编码(或者如果有相当常见的东西,则添加到正则表达式中)。

要做到这一点,你可以这样做:

data walnov21p2 nomatch;
length brandmodel $ 80;
infile "G:\File2\data\store_nov21\storenv21p2.csv" firstobs=2 dlm="|" dsd;
input brandmodel price;
re= prxparse('/[[:alpha:]]{1,3} \d{1,4}/');
if prxmatch(re, brandmodel) then
do;
        model=prxposn(re, 0, brandmodel);
        output walnov21p2 ;
end;
else output nomatch;
run;

然后你可以单独处理nomatch并在以后重新组合它们。