0

我正在尝试从地址字段中提取 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
4

2 回答 2

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%。您可能会考虑同时使用这两种方法,并查看他们不同意的记录。

于 2013-05-03T17:18:24.497 回答
0

所有 SAS 安装都附带一个名为 SASHELP.ZIPCODE 的数据集。它包含所有美国邮政编码的最新列表(或者您可以从此处的 SAS 站点下载最新的)。只需提取任何看起来像 5 位数的 zip 的东西,然后将其撞到列表中。

如果您想格外小心,您可以从 zipcode 表中提取州名(或州缩写),并确保在包含 zip 的字符串中的某处也可以找到州名。

于 2013-05-03T16:46:48.083 回答