-2

给定下面的一列,我试图使用 sas 9.1 分隔联系人、地址、邮编、电话、传真和网站地址

第 1 列:公司地址

联系人: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 回答