2013-05-03 1 views
0

Я пытаюсь извлечь 5-значный почтовый индекс из поля адреса. Я включил образцы данных (см. Ниже). Данные имеют 5-значное поле улицы в начале, а также 5-значный номер PO Box в средней части и 5-9 цифр zipcodes, некоторые в средней части и некоторые в конце строки. моя цель состоит в том, чтобы извлечь 5-значный индексный код из строки, но не 5-значную улицу и номер PO Box, используя регулярное выражение в SAS. Пожалуйста, взгляните на образцы данных и помогите мне решить эту проблему. Я был бы очень признателен за вашу любезную помощь.Как извлечь zipcode из очень meshy-строки, используя регулярное выражение в SAS?

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 
+1

Вы хотите только 5-значный из конца или если он использует 9-значный почтовый индекс, вы также хотите, чтобы 9 цифр были извлечены? Так как '12713 SW 125TH AVE MIAMIFL 331865932' будет извлекать' 331865932', а '601 W 80TH STREET CHICAGO IL 60620 2502' будет извлекать' 60620 2502'? – Walls

+2

является умышленным каламбуром? – Jodrell

ответ

0

Существует набор данных, который поставляется со всеми установками SAS под названием SASHELP.ZIPCODE. Он содержит довольно современный список всех американских почтовых индексов (или вы можете скачать последние данные с сайта SAS here). Просто извлекайте все, что похоже на 5-значный почтовый индекс, а затем перетащите его в список.

Если вы хотите быть более внимательным, вы можете вытащить имя таблицы (или аббревиатуру состояния) из таблицы zipcode и убедиться, что имя состояния можно найти где-то в строке, содержащей zip.

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%. Вы можете подумать об использовании обоих методов и посмотреть на записи, где они не согласны.