Bersihkan atribut

8

Saya ingin membersihkan tabel atribut dari shapefile jalan untuk semua entri di bidang.

Sebagai contoh: Seperti terlihat di bawah ini saya memiliki fitur jalan dengan "Nama", Nama Dari dan Nama Ke dalam daftar atribut. Di baris yang dipilih nama segmen adalah Louis Botha.

NameFrom juga mengandung nama segmen ini (Louis Botha & Tidak Dikenal).

Setelah saya membersihkan data, saya hanya ingin yang berikut ditampilkan di bidang yang relevan:

Name = Louis Botha Name From = Nama Tidak Dikenal To = Janeke

Apakah ada cara untuk menghapus ini di bidang "nama dari" dan "nama ke" untuk SEMUA atribut?

masukkan deskripsi gambar di sini

Dean van den Heever
sumber
Jadi, Anda ingin dibiarkan dengan "Louis Botha", "& Tidak Diketahui", dan "Janeke &"?
floem
Bisakah Anda memperbarui pertanyaan Anda untuk memasukkan contoh dari output yang dibersihkan?
Aaron
@ phloem: Ya, saya ingin ditinggal bersama Louis Botha "," & Unknown ", dan" Janeke. @ Harun Saya memperbarui pertanyaan untuk membuatnya lebih jelas.
Dean van den Heever

Jawaban:

3

Script berikut melakukan tindakan Anda setelah menggunakan kursor. Ada banyak penanganan kesalahan untuk menangani banyak masalah potensial - hapus sesuai kebutuhan. Ini mengubah data asli, jadi pastikan untuk menjalankan ini pada salinan untuk memastikan hasil yang Anda cari. Saya menambahkan komentar dalam skrip daripada menyoroti di sini.

import arcpy, os

fc = r'C:\temp\test.gdb\test_1'

with arcpy.da.UpdateCursor(fc, ["Name", "Name_From", "Name_To", "OID@"]) as cursor:
    for row in cursor:
        if row[0] != None:  # Make sure there are no None type data

            # 1) Split strings by "&" and 2) remove leading/tailing white space
            cleaned = [x.strip() for x in row[1].split("&")] # "Name_From" field
            cleaned2 = [x.strip() for x in row[2].split("&")] # "Name_To" field

            # Tackling the "Name_From" field
            if row[0] in cleaned: # Make sure "Name" is in "Name_From" field
                cleaned.remove(row[0]) # Remove "Name" from field
                if len(cleaned) > 1:
                    new = ' & '.join(cleaned)
                    row[1] = new
                elif len(cleaned) == 1:
                    row[1] = cleaned[0]
                else:
                    print "There was a problem with OID %s" % row[3]

            # Tackling the "Name_To" field
            if row[0] in cleaned2: # Make sure "Name" is in "Name_To" field
                cleaned2.remove(row[0]) # Remove "Name" from field
                if len(cleaned2) > 1:
                    new2 = ' & '.join(cleaned2)
                    row[2] = new2
                elif len(cleaned2) == 1:
                    row[2] = cleaned2[0]
                else:
                    print "There was a problem with OID %s" % row[3]
        cursor.updateRow(row)

masukkan deskripsi gambar di sini

Harun
sumber
6

Anda dapat menggunakan fungsi Python berikut dalam Field Calculator.

def remove_name(name_value, from_to_value):
    streets = [street.strip() for street in from_to_value.split('&') if street.strip() != name_value.strip()]
    return ' & '.join(streets)

Salin kode di atas ke bagian kode skrip kode / pra-logika. Anda dapat menjalankannya sekali untuk Name_From menggunakan remove_name(!Name!, !Name_From!)sebagai ekspresi, dan kedua kalinya untuk Name_To menggunakan remove_name(!Name!, !Name_To!).

Kode ini akan berfungsi tidak hanya untuk kasus-kasus di mana nilai Nama berada di awal atau akhir Name_From / Name_To , tetapi juga yang ada di tengahnya. Misalnya, remove_name('Janeke', 'Hereeniging & Janeke & Willemse')kembali 'Hereeniging & Willemse'. Agar ini berfungsi, nama input harus dipisahkan oleh ampersand ( &).

orang bodoh
sumber
Apakah ini akan membersihkan semua atribut dalam sekali jalan atau setiap baris secara individual? Maaf sudah bertanya, skrip prelogik tidak terlalu terkini.
Dean van den Heever
Kalkulator bidang memodifikasi setiap catatan yang dipilih dari satu bidang pada waktu yang sama (atau semua catatan dalam tabel jika tidak ada fitur yang dipilih).
nmpeterson