3

我正在尝试使用 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;
4

2 回答 2

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
于 2012-12-13T15:25:33.640 回答
1

您可以使用的一种方法是构建一个 Makes(Nikon、Olympus 等)字典,并使用它从字符串中删除 make;然后你有 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 并在以后重新组合它们。

于 2012-12-13T15:37:30.100 回答