0

住所フィールドから 5 桁の郵便番号を抽出しようとしています。サンプルデータを含めました(下記参照)。データには、先頭に 5 桁の番地フィールドがあり、中間部分に 5 桁の私書箱番号と、文字列の中間部分と末尾に 5 ~ 9 桁の郵便番号があります。私の目的は、文字列から 5 桁の郵便番号を抽出することですが、SAS で正規表現を使用して 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 を含めて、最後の一致で 65932 ではなく 33186 と一致するようにする必要があります。このルールは、他のさまざまな可能性に応じて、より良い場合もあれば悪い場合もあります。データによっては、100% をキャッチするのに十分な一致がない可能性があります。両方の方法を実行し、一致しないレコードを調べることを検討してください。

于 2013-05-03T17:18:24.497 に答える
0

すべての SAS インストールに付属する SASHELP.ZIPCODE というデータセットがあります。これには、すべての米国の郵便番号のかなり最新のリストが含まれています (または、SAS のサイトから最新のものをダウンロードできます)。5 桁の zip のように見えるものをすべて抽出し、それをリストと照合するだけです。

特別な注意が必要な場合は、郵便番号表から州名 (または州の略語) を取得し、郵便番号を含む文字列のどこかに州名が含まれていることを確認してください。

于 2013-05-03T16:46:48.083 に答える