2012-12-13 45 views
3

我想使用SAS PRX函數從我的數據集中提取一個子串。但它只返回完全匹配,而我需要它更靈活,並提取符合各種條件的匹配。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

對於最後一個問題(設置變量丟失而不是丟棄觀察值,從最後的條件中刪除output語句。只需將其更改爲:

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 
+0

謝謝。我在SAS在線論壇上解決了它。 – user1901322

+1

你可以(也應該)發佈你的問題的答案並接受它。這確保其他人尋找相同的答案可以在這裏找到它。 – itzy

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和他們後來又重新結合起來。

+0

感謝您的幫助。我在SAS在線論壇上解決了這個問題 – user1901322

+1

如果您有解決方案,請在此處發佈(作爲編輯或單獨的答案) - 沒有比看到某人發佈問題然後「我找到答案」更令人沮喪的了,沒有發佈答案,對於有類似問題的其他人尋找答案... – Joe

+0

https://communities.sas.com/message/147750#147750看起來是用戶提到的論壇主題。 – Joe