读取sas字符串中的特定单词

时间:2013-02-19 21:17:30

标签: sas

鉴于下面一栏,我试图将联系人,地址,邮编,电话,传真和电子邮件分开。网站地址使用sas 9.1

第1栏:Company_address

  

联系人:肖恩柯林斯地址:6301 NW 5th Way Suite1700 Fort   佛罗里达州劳德代尔堡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;

非常感谢一些帮助来解决这个问题。

注意:这里发布的问题不是我的工作/工作的一部分,我是一个新手试图找出事情(这些是我自己的场景),原因是好奇心..语法在某种程度上有效,但程序无法区分公司名称和联系人姓名谢谢。

1 个答案:

答案 0 :(得分:0)

这个问题可能也是#34;本地化的"对于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位邮政编码,并会在日志中生成无效代码的错误消息(您可以忽略)。