1

私は次variable1のような文字列を持っています"asdfsad What do you do", "qwer What is your name", "Zebra"

しかもvariable2紐付き"asdfsad", "qwer", "Animal"

の単語と等しい場合、 variable1 の文字列から最初の単語を削除したいと思いますvariable2。これまでに思いついた唯一のことは、各単語を個別に置き換えることです。

ievariable1=tranwrd(variable1, "asdfsad", "");などしかし、私は置き換える言葉がたくさんあります。

助けてくれて本当にありがとうございます。

4

4 に答える 4

2

このようなものはどうですか:

data sample;
  length variable1 variable2 $100;
  variable1= "asdfsad What do you do"; variable2 = "asdfsad"; output;
  variable1= "qwer What is your name"; variable2 = "qwer";    output;
  variable1= "Zebra"                 ; variable2 = "Animal";  output;
run;

data fixed;
  length first_word $100;

  set sample;

  first_word = scan(variable1,1);
  if first_word eq variable2 then do;
    start_pos = length(first_word) + 1;
    variable1 = substr(variable1,start_pos); 
  end;
run;

これは、最初の単語全体のマッチングに機能します。残りのテキストにはスペースやその他の句読点が残りますが、必要に応じて簡単に変更できるはずです。

問題が最初の単語全体ではなく文字ごとに一致することである場合、それは非常に異なる質問になるため、新しい質問を投稿することをお勧めします.

于 2012-09-05T01:46:46.047 に答える
0

tranwrdの結果に満足している場合は、それも使用できます。空白に注意する必要があります

variable1 = strip(tranwrd(variable1, strip(variable2), ''));
于 2012-09-05T04:13:38.483 に答える
0
if scan(variable1,1)=variable2 then
  variable1=substr(variable1,index(variable1," "));
于 2012-09-05T10:21:24.400 に答える
0

これはおそらく何千もの単語に対して効率的または実行可能ではありませんが、Perl 正規表現 (例: s/search/replacement/) を介して使用できます。prxchange

/* words to match delimited by "|" */
%let words = asdfsad|qwer|Animal|foo|bar|horse;

/* example data */
data example;
  infile datalines dlm=',' dsd;
  input string: $256.;
datalines;
asdfsad What do you do
qwer What is your name
Zebra
food is in the fridge
foo    A horse entered a bar
;
run;

/* cleaned data */
data example_clean;
  set example;

  /*
    regular expression is:
      - created once on first row (_n_ = 1)
      - cached (retain regex)
      - dropped at the end (drop regex).
  */
  if _n_ = 1 then do;
    retain regex;
    drop regex;
    regex = prxparse("s/^(&words)\s+//");
  end;

  string = prxchange(regex, 1, string);  /* apply the regex (once) */
run;

正規表現の^記号 ( で構築prxparse) は、単語の先頭でのみ一致することを保証し、|記号はそれを「or」一致にし、 は\s+1 つ以上の空白文字に一致します (これが、私の例では「食べ物」である理由です)。一致しません)。

于 2012-09-09T08:20:22.553 に答える