Dọn dẹp thuộc tính


8

Tôi muốn dọn sạch bảng thuộc tính của một shapefile đường cho tất cả các mục trong các trường.

Ví dụ: Như được thấy bên dưới, tôi có một tính năng đường với "Tên", Tên từ và Tên đến trong danh sách thuộc tính. Trong hàng được chọn, tên của phân khúc là Louis Botha.

NameFrom cũng chứa tên phân khúc này (Louis Botha & Unknown).

Sau khi tôi dọn sạch dữ liệu, tôi chỉ muốn trình bày sau đây trong các trường có liên quan:

Tên = Louis Botha Tên Từ = Tên không biết Đến = Janeke

Có cách nào để loại bỏ điều này trong cả hai trường "name from" và "name to" cho TẤT CẢ các thuộc tính không?

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


Vì vậy, bạn muốn được để lại với "Louis Botha", "& Unknown" và "Janeke &"?
phloem

Bạn có thể vui lòng cập nhật câu hỏi của bạn để bao gồm một ví dụ về đầu ra được làm sạch?
Aaron

@ phloem: Có, tôi muốn được ở lại với Louis Botha "," & Unknown "và" Janeke. @Aaron Tôi cập nhật câu hỏi để làm cho nó rõ ràng hơn.
Dean van den Heever 19/2/2015

Câu trả lời:


2

Kịch bản sau đây thực hiện các hành động bạn đang thực hiện sau khi sử dụng con trỏ. Có rất nhiều xử lý lỗi để xử lý rất nhiều vấn đề tiềm ẩn - loại bỏ khi cần thiết. Điều này làm thay đổi dữ liệu gốc, vì vậy hãy đảm bảo chạy dữ liệu này trên một bản sao để đảm bảo kết quả là những gì bạn đang theo đuổi. Tôi đã thêm ý kiến ​​trong kịch bản chứ không phải làm nổi bật ở đây.

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)

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


5

Bạn có thể sử dụng hàm Python sau trong Máy tính trường.

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)

Sao chép phần trên vào phần mã script / tiền mã hóa. Bạn có thể chạy nó một lần cho Name_From bằng cách sử dụng remove_name(!Name!, !Name_From!)làm biểu thức và lần thứ hai cho Name_To sử dụng remove_name(!Name!, !Name_To!).

Mã này sẽ hoạt động không chỉ cho các trường hợp giá trị Tên nằm ở đầu hoặc cuối của Name_From / Name_To , mà cả những nơi nằm ở giữa. Ví dụ, remove_name('Janeke', 'Hereeniging & Janeke & Willemse')trả về 'Hereeniging & Willemse'. Để làm việc này, các tên đầu vào phải được phân tách bằng ký hiệu ( &).


Điều này sẽ làm sạch tất cả các thuộc tính trong một lần hoặc từng dòng riêng lẻ? Xin lỗi vì đã hỏi, không cập nhật kịch bản prelogic.
Dean van den Heever 19/2/2015

Máy tính trường sửa đổi mọi bản ghi được chọn của một trường cùng một lúc (hoặc tất cả các bản ghi trong bảng nếu không có tính năng nào được chọn).
nmpeterson
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.