Feld mit ArcPy umbenennen?

9

Was ich tun muss:

  1. Benennen Sie einen Feldnamen einer Tabelle / Feature-Class um
  2. Kopieren Sie alle Werte in das neue Feld

Bisher habe ich folgenden Code ausgeführt, wie @ artist21 vorschlägt:

import sys
import traceback
import arcpy
from arcpy import env

## ARGUMENTS
# argv[1] = input table/feature class path
# argv[2] = input old field name
# argv[3] = input new field name  

path = sys.argv[1]
oldFieldName = sys.argv[2] 
newFieldName = sys.argv[3] 

env.overwriteOutput = True

fields = arcpy.ListFields(path)
for field in fields:
    if field.aliasName == oldFieldName:
        if not oldFieldName == newFieldName:
            fieldType = field.type
            # Add new field
            arcpy.AddField_management(path, newFieldName, fieldType)
            #Calculates the new field based on old field values
            arcpy.CalculateField_management(path, newFieldName, "!"+oldFieldName+"!", "PYTHON", "")
            # Delete the old field (if necessary)
            arcpy.DeleteField_management(path, oldFieldName)

Wie kann ich dem Feldtyp field.typeder AddField_managementMethode zuordnen? Und während sich das Feld in der Mitte befindet, wird das Feld aus der Mitte gelöscht und zum letzten hinzugefügt. Das sieht nicht so aus, als würde der Feldname umbenannt.

Gibt es eine bessere Lösung, die mir dabei hilft?

Emi
quelle
Ihr Feature-Layer-Feld wird hier nicht umbenannt: fieldInfo.setNewName (Index, "stat"). Aus diesem Grund wird in der Zeile row.setValue ("stat", gValue) ein Fehler angezeigt.
Artwork21
2
setNewName (index, new_field_name) darf nur zum Festlegen neuer Feldnamen dienen, nicht zum Umbenennen vorhandener.
Artwork21
2
Ein FieldInfo-Objekt hat nichts mit den zugrunde liegenden Daten zu tun. Es ist lediglich eine Darstellung der Feldeigenschaften, die als Eingabe für bestimmte Tools zum Erstellen neuer Daten verwendet werden können, ähnlich wie bei einem FieldMappings-Objekt.
blah238
1
Ist old_fieldein Variablenname oder der tatsächliche Name des alten Feldes? Wenn es sich um einen Variablennamen handelt, müssen Sie die Formatierung oder Verkettung von Zeichenfolgen verwenden, um den Wert der Variablen in Klammern (VB-Parser) oder Ausrufezeichen (Python-Parser) zu setzen.
blah238
1
Ein Alias ​​ist im Allgemeinen ein "Spitzname" oder ein Pseudonym . Es muss nicht unbedingt dem tatsächlichen Spaltennamen in der Datenbank entsprechen.
blah238

Antworten:

15

Versuchen Sie dies mit einer Kombination aus Arcpy-Werkzeugen "Feld hinzufügen", "Feld berechnen" und "Feld löschen":

if fieldInfo.getFieldName(index) == "status":
    arcpy.AddField_management(layer, "stat", "TEXT", "", "", "50", "",        "NULLABLE", "NON_REQUIRED", "")                     
    arcpy.CalculateField_management(layer, "stat", "!status!", "PYTHON_9.3", "")
    arcpy.DeleteField_management(layer, "status")
Artwork21
quelle
1
Ich möchte die beiden Feldtypen gleich machen. Die Feldtypnamen von field.Type und AddField_management sind jedoch nicht identisch. Was ist zu tun?
Emi
@Emi, ich verstehe nicht, was du mit "zwei Feldtypen gleich" meinst? Sie möchten, dass der Wert in "Status" in ein neues Feld mit dem Namen "stat" eingefügt wird?
Artwork21
Ja, ich möchte, dass der Wert in "Status" in das neue Feld "stat" eingegeben wird
Emi
Ich habe es auch versucht fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")anstatt fieldInfo.setNewName(index, "stat"). Aber der gleiche Fehler ist mit meinem Code passiert.
Emi
Versuchen Sie für Zeilen = arcpy.UpdateCursor (inputFeatureClass) möglicherweise Zeilen = arcpy.UpdateCursor (Ebene)
Artwork21
9

Sie können ein Feld jetzt mit dem ArcGIS Desktop GP-Kerntool - Feld ändern (Datenverwaltung) umbenennen . Dieses Tool bietet die Möglichkeit, Felder oder Feldaliasnamen für jede Geodatabase-Tabelle oder Feature-Class umzubenennen.

Dieses Tool ist ab 10.2.1 verfügbar .

Alex Tereshenkov
quelle
5
Dies unterstützt nur bestimmte Datenformate. Insbesondere wird bei Shapefiles ein Fehler ausgegeben.
jpmc26
3

Um ein Feld in einer Tabelle oder Feature-Class umzubenennen, würde ich das hier beschriebene Verfahren ausprobieren .

  1. Starten Sie ArcMap und öffnen Sie das Katalogfenster.
  2. Suchen Sie die Datenbank, die die Tabelle enthält, die Sie ändern möchten.
  3. Klicken Sie mit der rechten Maustaste auf die Tabelle und klicken Sie auf Eigenschaften.
  4. Klicken Sie auf die Registerkarte Felder.
  5. Klicken Sie auf den vorhandenen Text in der Spalte Feldname und geben Sie einen neuen Namen ein.

Ich habe dies gerade an einer Datei-Geodatabase-Tabelle mit ArcGIS für Desktop Standard 10.1 SP1 getestet und es hat einwandfrei funktioniert.

Leider habe ich nach dem Schreiben der PDF-Datei "Was ist neu in ArcGIS 10.1" gesucht und festgestellt, dass diese Funktionalität möglicherweise in dieser Version hinzugefügt wurde. Es könnte sich jedoch lohnen, das neueste Service Pack 10.0 zu testen, um festzustellen, ob es auch dort wieder portiert wurde.

PolyGeo
quelle
1
Ich glaube, Emi sucht nach einer bogenförmigen Lösung.
Artwork21
Eigentlich suche ich nach arcpy Lösung
Emi
1
Mein Fehler - ich dachte, @Emi sagte "Gibt es eine bessere Lösung ..." [meine Kühnheit].
PolyGeo
1

zwei große Probleme mit dem Code:

  • Wenn der Datentyp kein FeatureLayer ist, überspringt das Programm die Feldinfo-Manipulationen und versucht dann, den Wert auf ein neues / umbenanntes Feld festzulegen, das nie erstellt / umbenannt wurde

  • Die zwei Zeilen:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    habe ein großes Problem. Wenn der frühere Code funktioniert hat Das Feld "Status" existiert nicht.

mhoran_psprep
quelle
Ich habe den Code überprüft und während es sich um einen Feature-Layer handelt und die Feature-Class ein Feld mit dem Namen "Status" enthält, wird der gleiche Fehler
ausgegeben
Wenn die erste Zeile funktioniert, funktioniert die zweite Zeile nicht.
mhoran_psprep
Sie haben die Informationen in der Ebene geändert, lesen und schreiben jedoch Daten von / in die Feature-Class
mhoran_psprep
1

Wie kann ich field.type dem Feldtyp der AddField_management-Methode zuordnen?

Dies erfolgt laut diesem Beitrag automatisch .

Und während sich das Feld in der Mitte befindet, wird das Feld aus der Mitte gelöscht und zum letzten hinzugefügt. Das sieht nicht so aus, als würde der Feldname umbenannt. Gibt es eine bessere Lösung, die mir dabei hilft?

Wie in Ihrer anderen Frage erwähnt , können Sie nur die gesamte Feature-Class / Tabelle löschen und neu erstellen oder die Spaltendefinition im zugrunde liegenden DBMS ändern.

Ich nehme an, Sie könnten alle Benutzerspalten löschen und in der gewünschten Reihenfolge neu erstellen, aber das ist ein bisschen verrückt. Das Skript in dieser Antwort macht genau das, Sie könnten es wahrscheinlich an Ihre Bedürfnisse anpassen.

blah238
quelle
Während field.type = "string" ist, müssen wir "text" bei AddField_management übergeben. Ich habe es überprüft.
Emi
Bist du sicher? Es funktioniert bei mir bei 10.0 SP5.
blah238
Es gibt mir Fehler: arcgisscripting.ExecuteError: Fehler beim Ausführen. Parameter sind ungültig. FEHLER 000800: Der Wert ist kein Mitglied von TEXT | FLOAT | DOPPELT | KURZ | LANG | DATUM | BLOB | RASTER | GUID. Ausführung fehlgeschlagen (AddField).
Emi
Auf welcher Version / SP bist du?
blah238
Ich benutze 10.0. Ich kenne die Service Pack-Nummer nicht.
Emi