我正在尝试从地址字段中提取5个数字邮政编码。我已经包含了样本数据(见下文)。数据开头有5位数的街道字段,中间部分还有5位数的邮政信箱号码和5-9位数的邮政编码,有些位于中间部分,有些位于字符串末尾。我的目标是使用SAS中的正则表达式从字符串中提取5位数的邮政编码,而不是5位数的街道和邮政信箱号码。请查看示例数据并帮助我解决此问题。非常感谢您的帮助。
13001 NW42 AVE OPA LOCKA FL 33054 USA
13001 NW 42 AVENUE OPA LOCKA FL 33054 USA
PO BOX 98748 CHICAGO IL 60693 USA
601 W 80TH STREET CHICAGO IL 60620 2502
12651 S DIXIE HWY, SUITE 321 MIAMI,FLORIDA33156
12713 SW 125TH AVE MIAMIFL 331865932
答案 0 :(得分:1)
这适用于您的具体示例。
data have;
length str $150;
infile datalines truncover;
input @1 str $150.;
datalines;
13001 NW42 AVE OPA LOCKA FL 33054 USA
13001 NW 42 AVENUE OPA LOCKA FL 33054 USA
PO BOX 98748 CHICAGO IL 60693 USA
601 W 80TH STREET CHICAGO IL 60620 2502
12651 S DIXIE HWY, SUITE 321 MIAMI,FLORIDA33156
12713 SW 125TH AVE MIAMIFL 331865932
;;;;
run;
data want;
set have;
z_Re = prxparse('`(\d{5}) ?(?:$|USA|\d{4})`o');
rc_z = prxmatch(z_re,trimn(str));
if rc_z then zip = prxposn(z_re,1,str);
put zip=;
run;
您可以调整它以包含其他内容,或者对可能出现5(+)数字字符串的可能位置进行一些合理性检查,这是一个邮政编码。例如,您可能要求它在字符串结尾的10个字符内,并且从字符串开头起至少10个字符:
data want;
set have;
z_Re = prxparse('`^.{10,}\D(\d{5}).{0,10}$`o');
rc_z = prxmatch(z_re,trimn(str));
if rc_z then zip = prxposn(z_re,1,str);
put zip=;
run;
我必须包含一个\ D以确保它在最后一场比赛中匹配33186而不是65932。根据您的各种其他可能性,此规则可能更好或可能更差;根据您的数据,可能没有匹配足以捕获100%。您可以考虑使用这两种方法,并查看它们不同意的记录。
答案 1 :(得分:0)
所有SAS安装都附带一个名为SASHELP.ZIPCODE的数据集。它包含所有美国邮政编码的最新列表(或者您可以从SAS网站here下载最新的)。只需提取任何看起来像5位数字的拉链,然后将其打到列表中。
如果你想要格外小心,你可以从zipcode表中提取州名(或州名缩写),并确保在包含zip的字符串中的某处找到州名。