Cách chia trường địa chỉ đơn thành 4 trường (Số nhà, Hướng, Tên, Hậu tố)


8

Tôi phải thực hiện một số thao tác xoa bóp dữ liệu bưu kiện của chúng tôi để có thể sử dụng nó bằng một chương trình trong trực thăng cảnh sát trưởng. Chương trình yêu cầu một trong các định dạng địa chỉ sau trong các trường:

nhập mô tả hình ảnh ở đây

Địa chỉ của chúng tôi hiện đang ở trong một lĩnh vực: ví dụ: 1234 W Main St.

Có cách nào để tự động hóa việc tách các trường thành một trong các định dạng mong muốn này không?

Tôi có thể tưởng tượng định dạng hai trường sẽ dễ dàng hơn bằng cách chỉ cần gọi tách sau các số, nhưng cũng có thể gây ra sự cố cho các đường phố như 1st Ave, v.v.


Định dạng "ít mong muốn" có thể dễ dàng đạt được bằng cách tách sau khoảng trắng đầu tiên. Việc chia phần còn lại trở nên khó khăn hơn một chút, vì bạn có thể có hoặc không có tiền tố chỉ đường và tên đường phố có thể có hoặc không có khoảng trắng trong đó, v.v.
Erica

TẤT CẢ tên đường phố của bạn có được định dạng theo cùng một cách không? Tôi đoán là không làm cho việc phân tích cú pháp PreDIR trở nên khó khăn
GISKid

Không. Một số có PREDIR và một số thì không. Đây có phải là một nơi tốt để tạo một số loại câu lệnh if / then thành tập lệnh không? Nếu SE, SW, NE, NE, v.v. thì dân PREDIR không làm gì khác?
Craig

Ngoài ra, kết hợp với câu trả lời của tôi, bạn có thể phân tích tất cả các hướng khi bạn đi, tất cả các số và sau đó xem những gì bạn còn lại với. Nó không đẹp hay dễ.
GISKid

Câu trả lời:


10

Thay vì sử dụng nhiều RegExes để phân tích địa chỉ, chỉ cần sử dụng công cụ ngoài hộp của Esri được thiết kế cho tác vụ này, Chuẩn hóa địa chỉ . Nó có sẵn ở tất cả các cấp giấy phép và kinh nghiệm của tôi với nó là tích cực.

Hình ảnh Esri


Giải pháp OOB là tốt nhất, tốt đẹp (+1)!
Aaron

@Paul Thôi nào, anh hỏi trăn! Đùa thôi, tôi cũng sẽ sử dụng cái này trong tương lai, dễ hơn nhiều so với regex.
GISKid

@GISKid, haha! Tôi bắt đầu thử phân tích cú pháp với regex, và cuối cùng đã tìm thấy công cụ này, dường như không phải là tất cả. Tôi không biết tại sao.
Paul

1

Bạn có thể đạt được điều này trong máy tính trường bằng python. Đây có thể không phải là thanh lịch nhất nhưng đó là một sự khởi đầu, giả sử trường hợp đơn giản nhất (ví dụ: tất cả các địa chỉ của bạn trông giống nhau). Trước tiên tôi sẽ tạo các trường bổ sung cần thiết. Giả sử cột của bạn có địa chỉ đầy đủ được gọi là "Địa chỉ".

Đối với HOUSENO trong máy tính trường, hãy viết:

##Return just numbers

import re
def strip_digits(s):
    return re.sub("\D+", "", s)

Điều này sau đó có thể được gọi từ hộp tính toán như sau:

strip_digits(!ADDRESS!)

Đối với tên đường phố của bạn:

# Return just the alpha characters


import re
def strip_letters (s):
  return re.sub ("\d",  "", s[1:])

Cơ sở mã hóa:

strip_letters(!ADDRESS!)

Đối với hướng giả định đó là ký tự đầu tiên mỗi lần:

#First character in streetname
import re
def strip_dir(s):
  return re.sub("\d", "", s[0])

Cơ sở mã hóa:

strip_dir(!ADDRESS!)

Đây là tài nguyên python cho re . Nghiên cứu điển hình 7.1 này : Địa chỉ đường phố đã giúp tôi nhiều lần với việc phân loại cơ sở dữ liệu đường phố / địa chỉ của tôi bằng cách sử dụng mô-đun python và re. Điều này sẽ giúp bạn ra ngoài, từ đây nếu bạn không nhận được kết quả mà bạn muốn nhận xét và tôi có thể thay đổi mã của mình


đã thử mã HOUSENO, nó hoạt động, nhưng nó cũng mang tất cả dữ liệu tên đường phố cùng với dữ liệu số nhà. có lẽ đối với phần này tách ra ở không gian đầu tiên là cách để đi.
Craig

Rất tiếc, xin lỗi đó là lỗi trong mã của tôi
GISKid 23/07/14

Được rồi, hãy thử cái mới
@Craig

Tôi đã thử cả hai mã HOUSENO và STREETNAME. Vấn đề tôi gặp phải là, đối với HOUSENO, nó đã lấy tất cả dữ liệu số ngay cả khi tên đường phố là 1234th Street, vì vậy tôi kết thúc với một số hồ sơ là 1231234 từ 123 1234 Street. Tương tự, từ mã STREETNAME, nó đang tước tất cả dữ liệu số, do đó, Phố 1234 sẽ trở lại "Đường thứ"
Craig

Bắt regex để làm việc trên một cái gì đó không đạt tiêu chuẩn như địa chỉ ở Mỹ sẽ là một nhiệm vụ khó khăn thực sự.
Paul

0

Giống như Erica đã nói, định dạng thứ hai của bạn rất dễ dàng. Nếu tất cả tên đường phố của bạn là một từ, bạn có thể kiểm tra độ dài của danh sách sau khi tách trường ban đầu. Độ dài 3 = không có tiền tố, độ dài 4 = có tiền tố (cũng giả sử SUFTYPE luôn được điền). Điều này thất bại khi một đường phố có nhiều hơn một từ, chẳng hạn như 'Grand River'. Bạn có thể kiểm tra xem phần tử thứ hai có khớp với danh sách các tiền tố được phép hay không và tiến hành từ đó. Bạn sẽ phải kiểm tra điều này để xem nó có hoạt động với dữ liệu của bạn không.


0

Đảm bảo đầu vào của bạn ở định dạng chuỗi và chỉ cần sử dụng hàm string.split () sẽ phân tách trên khoảng trắng và trả về danh sách. (ví dụ: "1234 W Main St." sẽ trả lại ["1234", "W", "Main", "St."])

Từ đó tôi sẽ sử dụng một số câu lệnh có điều kiện để kiểm tra dữ liệu của bạn tùy thuộc vào mức độ phù hợp của đầu vào của bạn. Nếu sự không nhất quán duy nhất trong dữ liệu của bạn là đôi khi có một dự đoán và những lần khác thì không, chỉ cần thực hiện kiểm tra len trên danh sách được trả về để xem nó có độ dài bằng 3 hoặc 4 (hoặc> 4 nếu đường của bạn không tên có khoảng trắng trong đó).

if len (splitList) == 4:

    HouseNo = splitList[0]
    PreDir = splitList[1]
    StreetName = splitList[2]
    SufType = splitList[3]

elif len (splitList) == 3:

    HouseNo = splitList[0]
    PreDir = ""
    StreetName = splitList[1]
    SufType = splitList[2]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.