属性をクリーンアップする


8

フィールドのすべてのエントリの道路シェープファイルの属性テーブルをクリーンアップしたいと思います。

例:以下に示すように、属性リストに「名前」、「名前の始点」、「名前の終点」のある道路フィーチャがあります。選択された行では、セグメントの名前はLouis Bothaです。

NameFromにもこのセグメント名が含まれています(Louis Botha&Unknown)。

データをクリーンアップした後、関連するフィールドに次の項目のみを表示します。

名前= Louis Botha名前From =不明な名前To = Janeke

すべての属性の「name from」フィールドと「name to」フィールドの両方でこれを削除する方法はありますか?

ここに画像の説明を入力してください


では、「ルイ・ボサ」、「&不明」、「ジャネケ&」を残したいですか?
師部2015

クリーンアップされた出力の例を含めるように質問を更新していただけませんか?
アーロン

@師部:はい、私はLouis Botha」、「&Unknown」、および「Janeke。@Aaron質問をより明確にするために更新しました。
Dean van den Heever 2015

回答:


2

次のスクリプトは、カーソルを使用した後のアクションを実行します。多くの潜在的な問題に対処するために多くのエラー処理があります-必要に応じて削除してください。これは元のデータを変更するので、コピーでこれを実行して、結果が目的のものであることを確認してください。ここでは強調するのではなく、スクリプトにコメントを追加しました。

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)

ここに画像の説明を入力してください


5

Field Calculatorで次のPython関数を使用できます。

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)

上記をcodeblock / pre-logicスクリプトのコードセクションにコピーします。あなたは一回それを実行することができますName_From使用してremove_name(!Name!, !Name_From!)発現、およびための第二の時間としてName_Toを使用しますremove_name(!Name!, !Name_To!)

このコードは、Name値がName_From / Name_Toの先頭または末尾にある場合だけでなく、途中にある場合にも機能します。たとえば、remove_name('Janeke', 'Hereeniging & Janeke & Willemse')返します'Hereeniging & Willemse'。これを機能させるには、入力名をアンパサンド()で区切る必要あります&


これにより、一度にすべての属性がクリーンアップされますか、それとも各行が個別にクリーンアップされますか?最新のprelogicスクリプトではなく、質問して申し訳ありません。
Dean van den Heever 2015

フィールド計算機は、単一フィールドの選択されたすべてのレコードを同時に変更します(機能が選択されていない場合は、テーブル内のすべてのレコード)。
nmpeterson 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.