3

SAS PRX 関数を使用して、データセットから部分文字列を抽出しようとしています。ただし、完全に一致するものしか返されませんが、より柔軟で、さまざまな条件に一致するものを抽出する必要があります。

以下のデータをコピーしました。ご覧のとおり、私のデータの変数の 1 つは、特定のカメラのブランド名とモデル番号の両方を含む「brandmodel」です。モデル番号専用の別の列が必要です。したがって、PRX関数を使用してそれらを抽出しています。通常、次のパターンのいずれかに従うためです。

例:JX100またはJX10またはJX1(つまり、1〜2個のアルファベットの直後に1〜3桁が続きます。これは(データの下にコピーされた)私のプログラムで処理できます。しかし、問題に遭遇するのは:これらのモデルを抽出する方法#は、アルファベットがスペースまたはハイフンで数字と区切られている場所で、それらをすべて同じ列「モデル」に抽出するにはどうすればよいですか?また、一部の観測にはモデル番号がありません。それらを完全に削除するのではなく、欠落に設定することはできますか?

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

使用できるアプローチの1つは、Make(Nikon、Olympusなど)の辞書を作成し、それを使用して文字列からmakeを削除することです。次に、 Olympus VR 340 16MP 10x 3.0 LCD Red->VR 340 16MP...があります。これは解析が簡単です。

ただし、正規表現では考えられるすべての状況を簡単に解析できないため、最終的には、これは正規表現では簡単に解決できない可能性があります(「NikonCoolpix」はメーカーですか、それとも「CoolpixS2600」はモデルですか?)。この種のことに対する最善の解決策は、「ほとんどの場合」の正規表現を作成することです。

/[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 に答える