-2

以下の列を考えると、sas 9.1 を使用して、連絡先、住所、郵便番号、電話、ファックス、および Web サイトのアドレスを分離しようとしていました。

列 1 : Company_address

連絡先:Sean Collins 住所:6301 NW 5th Way Suite1700 Fort Lauderdale, FL 33309 電話:(954) 689-3984 ファックス:(954) 689-3985 http://www.aajtech.com

出力は次のようになります

column 2 : Contact - Sean Collins
column 3 : address - 6301 NW 5th Way   Suite1700   Fort Lauderdale, FL
column 4 : zip - 33309 
column 5 : phone - (954) 689-3984
column 6 : fax - (954) 689-3985
column 7 : website - http://www.aajtech.com

これが私が試していたものです。

proc sort data=Ex2 out=Ex3 nodup dupout=b_out; 
 by city;
run;

data Final;
set Ex2;
a=find(Company_Address,"http");
website=substr(Company_Address,a,50);
b=find(Company_Address,"Phone:");
phone=substr(Company_Address,b,21);
c=find(Company_Address,"Fax");
Fax=substr(Company_Address,c,19);
Add=substr(Company_Address,1,b-1);
Z=find(Add,"http");
Address=substr(Add,1,z-1);
if Address=website then Address=" ";
drop a b c z Add;
run;

これを理解するための助けは大歓迎です。

注:ここに投稿された質問は私の仕事/仕事の一部ではありません.物事を理解しようとしている初心者です(これらは私自身のシナリオです).理由は好奇心です..構文はある程度うまくいきましたが、プログラムはできません会社名と連絡先名を区別するためにありがとう。

4

1 に答える 1

0

この質問は、おそらく StackOverflow には「ローカライズ」されすぎていますが、興味深いと思ったので、とにかく解決策を示します。コーディング手法は、他の人にも役立つ場合があります。

data Final;
   set Ex2;
   /* Define the variables you want to keep */
   length Contact $30
          Address $60
          Zip     $5
          Phone   $20
          Fax     $20
          Website $60;
   keep Contact Address Zip Phone Fax Website;

   length tmp_addr var value $200;
   tmp_addr = company_address;
   do while(not last_var);
      var = scan(tmp_addr,1,':');
      substr(tmp_addr,1,length(var)+1) = '';
      if index(tmp_addr,':') > 0 then do;
         value = scan(tmp_addr,1,':');
         value = substr(value,1,length(value) - length(scan(value,-1,' '))-1);
         substr(tmp_addr,1,length(value)+1) = '';
         end;
      else do;
         value = tmp_addr;
         last_var = 1;
         end;
      var = left(var);
      value = left(value);
      select(var);
         when ('Contact') do;
            Contact = value;
            end;
         when ('Address') do;
            Zip = scan(value,-1,' ');
            if zipstate(zip) = ' ' 
               then do;
                  Zip = ' ';
                  Address = value;
                  end;
               else do;
                  Address = substr(value,1,length(value) - length(scan(value,-1,' '))-1);;
                  end;
            end;
         when ('Phone') do;
            Phone = value;
            end;
         when ('Fax') do;
            Fax = value;
            end;
         when ('http') do;
            Website = 'http:' || value;
            end;
         otherwise do;
            putlog 'Unknown variable: ' var;
            end;
         end;

      end;
run;

これは昔ながらの解決策であり、正規表現を使用したより現代的な方法があると確信しています。ループを使用して Company_Address 変数をステップ実行し、コロン プレフィックスで識別される列を解析します。提供されたサンプル文字列では問題なく機能します。

有効な郵便番号のチェックも追加しましたが、これは 5 桁の郵便番号に対してのみ機能し、無効なコードのログにエラー メッセージが生成されることに注意してください (これは無視できます)。

于 2013-02-20T02:29:03.267 に答える