鉴于下面一栏,我试图将联系人,地址,邮编,电话,传真和电子邮件分开。网站地址使用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;
非常感谢一些帮助来解决这个问题。
注意:这里发布的问题不是我的工作/工作的一部分,我是一个新手试图找出事情(这些是我自己的场景),原因是好奇心..语法在某种程度上有效,但程序无法区分公司名称和联系人姓名谢谢。
答案 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位邮政编码,并会在日志中生成无效代码的错误消息(您可以忽略)。