Cara membagi bidang alamat tunggal menjadi 4 bidang (House House, Direction, Name, Suffix)

8

Saya harus melakukan memijat data paket kami untuk membuatnya dapat digunakan oleh sebuah program di helikopter sheriff. Program ini membutuhkan salah satu format alamat berikut dalam bidang:

masukkan deskripsi gambar di sini

Alamat kami saat ini dalam satu bidang: mis: 1234 W Main St.

Apakah ada cara untuk mengotomatiskan pemisahan bidang ke dalam salah satu format yang diinginkan ini?

Saya dapat membayangkan dua format bidang akan lebih mudah dengan hanya memanggil split setelah angka, tetapi juga dapat menyebabkan masalah untuk jalan-jalan seperti 1st Ave, dll.

Craig
sumber
Format "kurang diinginkan" dapat dengan mudah dicapai dengan memisahkan setelah ruang pertama. Membagi sisanya menjadi sedikit lebih sulit, karena Anda mungkin atau mungkin tidak memiliki awalan arah dan nama jalan mungkin atau mungkin tidak memiliki spasi di dalamnya, dll.
Erica
Apakah SEMUA nama jalan Anda diformat dengan cara yang sama? Saya kira tidak yang akan membuat parsing keluar PreDIR rumit
GISKid
Tidak. Ada yang punya PREDIR dan ada yang tidak. Apakah ini tempat yang baik untuk membuat semacam pernyataan if / then ke dalam skrip? Jika SE, SW, NE, NE, dll maka isi PREDIR yang lain tidak melakukan apa-apa?
Craig
Atau, dalam hubungannya dengan jawaban saya, Anda dapat menguraikan semua arah saat Anda pergi, semua angka dan kemudian melihat apa yang tersisa. Itu tidak cantik atau mudah.
GISKid

Jawaban:

10

Alih-alih menggunakan beberapa RegExes untuk mem-parsing alamat, cukup gunakan Esri's out of the box tool yang dirancang untuk tugas ini, Standarisasi Alamat . Ini tersedia di semua level lisensi dan pengalaman saya positif.

Gambar esri

Paul
sumber
Solusi OOB adalah yang terbaik, baik (+1)!
Aaron
@ Paul Ayo, dia minta python! Hanya bercanda, saya akan menggunakan ini di masa depan juga, jauh lebih mudah daripada regex.
GISKid
@GISKid, haha! Saya mulai mencoba mengurai dengan regex, dan akhirnya menemukan alat ini, yang sepertinya tidak biasa. Saya tidak tahu kenapa.
Paul
1

Anda dapat mencapai ini dalam kalkulator lapangan menggunakan python. Ini mungkin bukan yang paling elegan tetapi ini adalah permulaan, dengan asumsi kasus paling sederhana (mis. Alamat Anda semua terlihat sama). Pertama saya akan membuat kolom tambahan yang dibutuhkan. Dengan asumsi kolom Anda dengan alamat lengkap disebut "Alamat".

Untuk HOUSENO di bidang kalkulator, tulis:

##Return just numbers

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

Ini kemudian dapat dipanggil dari kotak hitung sebagai:

strip_digits(!ADDRESS!)

Untuk nama jalan Anda:

# Return just the alpha characters


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

Codeblock:

strip_letters(!ADDRESS!)

Untuk arahan dengan asumsi itu adalah karakter pertama setiap kali:

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

Codeblock:

strip_dir(!ADDRESS!)

Berikut adalah sumber daya python untuk kembali . Ini 7.1 Studi Kasus: Alamat Jalan telah membantu saya berkali-kali dengan memilah saya basis data jalan / alamat juga menggunakan python dan re modul. Ini akan membantu Anda, dari sini jika Anda tidak mendapatkan hasil yang Anda inginkan komentar dan saya dapat mengubah kode saya

GISKid
sumber
mencoba kode HOUSENO, itu berhasil, tetapi juga membawa semua data nama jalan numerik bersama dengan data nomor rumah. mungkin untuk bagian ini membagi pada ruang pertama adalah cara untuk pergi.
Craig
Aduh, maaf itu kesalahan dalam kode saya
GISKid
Baiklah coba yang baru
@Craig
Saya sudah mencoba kode HOUSENO dan STREETNAME. Masalah yang saya alami adalah, bagi HOUSENO, ini mengambil semua data numerik bahkan jika nama jalannya adalah 1234th Street, jadi saya berakhir dengan beberapa catatan menjadi 1231234 dari 123 1234th Street. Demikian pula, dari kode STREETNAME, kode ini melucuti semua data numerik, sehingga 1234th Street mengembalikan "th Street"
Craig
Mendapatkan regex untuk mengerjakan sesuatu yang tidak standar seperti alamat di AS memang akan menjadi tugas yang sulit.
Paul
0

Seperti kata Erica, format kedua Anda mudah. Jika semua nama jalan Anda adalah satu kata, Anda bisa memeriksa panjang daftar setelah memecah bidang asli. Panjang 3 = tanpa awalan, panjang 4 = memiliki awalan (juga mengasumsikan SUFTYPE selalu diisi). Ini gagal ketika jalan lebih dari satu kata, seperti 'Sungai Besar'. Anda bisa memeriksa apakah elemen kedua cocok dengan daftar awalan yang diizinkan, dan melanjutkan dari sana. Anda harus menguji ini untuk melihat apakah itu berfungsi dengan data Anda.

recurvata
sumber
0

Pastikan input Anda dalam format string dan cukup gunakan fungsi string.split () yang akan terpecah pada spasi putih dan mengembalikan daftar. (mis. "1234 W Main St." akan kembali ["1234", "W", "Main", "St."])

Dari sana saya akan menggunakan beberapa pernyataan bersyarat untuk memeriksa data Anda tergantung pada seberapa konsisten input Anda. Jika satu-satunya ketidakkonsistenan dalam data Anda adalah bahwa terkadang ada predir dan waktu lainnya tidak ada, cukup lakukan pemeriksaan pada daftar yang dikembalikan untuk melihat apakah memiliki panjang 3 atau 4 (atau> 4 jika jalan Anda nama memiliki spasi di dalamnya).

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]
papadoo
sumber