El problema: tengo una geodatabase con varios conjuntos de datos y muchas más clases de entidad dentro. Los campos dentro de las clases de entidad se han poblado a través de combinaciones con los archivos de forma manual y ediciones. Muchas veces los campos de cadena se convertirá rellena con espacios en blanco (es decir,", '', '', etc) o la cadena "Null", y los campos numéricos se convertirá rellena con un cero (0). Me gustaría encontrar estos archivos y reemplazarlos con un verdadero valor NULL. Tengo el siguiente código, el cual se utiliza un UpdateCursor, pero todavía muy lento y no captura todos los NULL-como registros. ¿Alguien sabe de otras formas de realizar esta tarea?
GDB = arcpy.GetParameterAsText(0) #input geodatabase
arcpy.env.workspace = GDB
datasetList = arcpy.ListDatasets() #list datasets
for dataset in datasetList:
arcpy.env.workspace = os.path.join(GDB, dataset)
fcList = arcpy.ListFeatureClasses()
for fc in fcList:
arcpy.AddMessage("Processing %s..." % fc)
#count features
arcpy.MakeTableView_management(fc, "tempTableView")
count = int(arcpy.GetCount_management("tempTableView").getOutput(0))
if count > 0:
fieldList = arcpy.ListFields(fc)
for field in fieldList:
arcpy.AddMessage("...%s" % field.name)
rows = arcpy.UpdateCursor(fc)
for row in rows:
count = 0
if row.isNull(field.name):
continue # if already null
elif field.type == "Text":
value = row.getValue(field.name)
if value.lstrip(' ') == '' or value.lower() == '<null>': # looks for whitespace or '<null>'
row.setNull(field.name)
count += 1
elif field.type == "ShortInteger" or field.type == "LongInteger" or field.type == "Float" or field.type == "Double":
value = row.getValue(field.name)
if value == 0:
row.setNull(field.name)
count += 1
if count > 0: # update row if records have changed
rows.updateRow(row)
del rows
else:
arcpy.AddMessage("...NO RECORDS FOUND.")