PYTHON GIS / EXCEL - Listar campos vacíos dentro de features contenidos en base de datos

0

 


Aprende como usar Python (ArcPy) para exportar una lista de los campos vacíos en los elementos en tus bases de datos apoyado con excel

En este articulo aprenderás como hacer una lista de los campos vacíos que pueden tener los features dentro de una base de datos espacial utilizando Python de manera sencilla.



Si necesitas hacer un control de los campos no diligenciados dentro de los elementos (Feature o Shapefile, y tablas) contenidos en la base de datos que has venido desarrollando durante la ejecución de un proyecto, ya sea para llenarlos ó justificar porque están vacíos, este procedimiento te será de mucha ayuda, y hasta donde sé, no existe forma de hacer esto en ArcGIS de forma directa. 


Si quieres listar los campos vacíos de los elementos de una base de datos, sigue los pasos a continuación


A manera de aclaración, el siguiente procedimiento considera como campos vacíos aquellos que son nulos, en blanco, llenados con 0, -1 o 999; sean campos numéricos o alfanuméricos.


Cómo hacer una lista de los campos vacíos en los features de una base de datos espacial (File geodatabase .gdb o Personal geodatabase .mdb)


Paso 0: Haz un respaldo de la base de datos (Nunca se sabe que pueda pasar).


Paso 1: Identificar la ruta que representa la base de datos a examinar en el explorador del sistema operativo.


Paso 2: Abrir ArcMap (Un archivo mxd en blanco).


Paso 3: Abrir la ventana Python en la barra de herramientas Standard.


Muestra la ubicación de la ventana Python dentro de la barra de herramientas Standard (estándar)


Paso 4: Copiar en un blog de notas el siguiente código y reemplazar el texto C:\EJEMPLO\EJEMPLO.GDB en la línea #11 por la ruta de la base de datos identificada en el paso 1. Por otro lado reemplazar en la línea #09 C:\EJEMPLO por la ruta donde se guardara la lista en formato .txt. Si deseas modificar el nombre del archivo de salida, puedes cambiar la palabra "ListFields" en la línea #10 por el nombre de tu preferencia (Sin quitar las comillas).


NOTA IMPORTANTE: Este script siempre me ha dado problemas usando rutas muy largas por lo que recomiendo trabajar en una carpeta en la raíz de una unidad de almacenamiento (a).



Ejemplo de donde ubicar la base de datos dentro de una unidad de almacenamiento






import arcpy             #01
import os             #02
import sys             #03
import fileinput     #04
                    #05
reload(sys)             #06
sys.setdefaultencoding("utf-8")     #07
                    #08
outputDir = r"C:\EJEMPLO"     #09
outputName = "ListFields"     #10
A = r"C:\EJEMPLO\EJEMPLO.gdb"     #11
textFile = (outputDir + os.sep + outputName + ".txt")     #12
                    #13
outFile = open(textFile, "w")     #14
                    #15
def listFcsInGDB(gdb):     #16
    arcpy.env.workspace = gdb     #17
    tables = arcpy.ListTables()     #18
                        #19
    for table in tables:     #20
        fields = arcpy.ListFields(table)     #21
        problem_fields_set = set()     #22
        for field in fields:     #23
            with arcpy.da.SearchCursor(table, field.name) as cursor:     #24
                for row in cursor:     #25
                    field_value = row[0]     #26
                    if field_value is None or + \
                    (isinstance(field_value, (int, float)) and \
                    field_value == 0 or field_value == -1 or \
                    field_value == 999) or str(field_value).strip() == "" \
                    or str(field_value) == "0" or str(field_value) == '0' \
                    or str(field_value) == '-1' or str(field_value) == '999' \
                    or str(field_value) == '':     #33
                        problem_fields_set.add(field.name)     #34
        for problem_field in problem_fields_set:     #35
            outFile.write("{0}, {1}, {2}\n".format("TABLE", table, problem_field))     #36
                    #37
    for fds in arcpy.ListDatasets('', 'feature') + ['']:     #38
        if fds == '':     #39
            for fc in arcpy.ListFeatureClasses():     #40
                fields = arcpy.ListFields(fc)     #41
                problem_fields_set = set()     #42
                for field in fields:     #43
                    with arcpy.da.SearchCursor(fc, field.name) as cursor:     #44
                        for row in cursor:     #45
                            field_value = row[0]     #46
                            if field_value is None or + \
                            (isinstance(field_value, (int, float)) and \
                            field_value == 0 or field_value == -1 or \
                            field_value == 999) or str(field_value).strip() == "" \
                            or str(field_value) == "0" or str(field_value) == '0' \
                            or str(field_value) == '-1' or str(field_value) == '999' \
                            or str(field_value) == '':     #53
                                problem_fields_set.add(field.name)     #54
                for problem_field in problem_fields_set:     #55
                    outFile.write("{0}, {1}, {2}\n".format("GDB", fc, problem_field))     #56
        else:             #57
            for fc in arcpy.ListFeatureClasses('', '', fds):     #58
                fields = arcpy.ListFields(fc)     #59
                problem_fields_set = set()     #60
                for field in fields:     #61
                    with arcpy.da.SearchCursor(fc, field.name) as cursor:     #62
                        for row in cursor:     #63
                            field_value = row[0]     #64
                            if field_value is None or + \
                            (isinstance(field_value, (int, float)) and \
                            field_value == 0 or field_value == -1 or \
                            field_value == 999) or str(field_value).strip() == "" \
                            or str(field_value) == "0" or str(field_value) == '0' \
                            or str(field_value) == '-1' or str(field_value) == '999' \
                            or str(field_value) == '':     #71
                                problem_fields_set.add(field.name)     #72
                for problem_field in problem_fields_set:     #73
                    outFile.write("{0}, {1}, {2}\n".format(fds, fc, problem_field))     #74
                    #75
gdb = A                     #76
fcs = listFcsInGDB(gdb)     #77
outFile.close()             #78
                    #79
headers = 'DATASET_OR_CLASS, FEATURE_CLASS, PROBLEM_FIELDS'.split()     #80
for line in fileinput.input([outputDir + os.sep + outputName + ".txt"], inplace=True):     #81
    if fileinput.isfirstline():             #82
        print '\t'.join(headers)     #83
    print line,             #84


                                                                                            



Paso 5: Copiar el código modificado en la ventana Python y presionar la tecla Enter o Intro dos veces.


Paso 6: Una vez generado el archivo .txt (a), ábrelo, selecciona todo con CTR+E (b) y copia el texto con CTR+C (c).



Muestra grafica del resultado del archivo de texto y ejemplo de como copiar el contenido



Paso 7: Abre un archivo de Excel, en el apartado importación de texto selecciona como separador el carácter coma (,) tal como se muestra en la siguiente imagen.


Ejemplo de como importar el contenido del archivo de texto a excel





Ejemplo de como obtener el listado de los los campos vacíos en los elementos de la base de datos espacial llevado a EXCEL



De esta forma tendrás un listado de los campos vacíos que tienen tus features en la GDB, Espero hayas disfrutado este artículo, próximamente subiré un video explicativo del procedimiento que podrás consultar en este blog. Guarda mi blog entre tus enlaces favoritos, estaré subiendo muchos más trucos de este estilo, recuerda que puedes hacer llegarme tus inquietudes en la página de contacto o deja tu comentario, estaré atento a responder.







Entradas que pueden interesarte

Sin comentarios