4 votos

Comparar campos de dos tablas y calcular campo.

¿Puedes ayudarme a comparar campos en dos tablas? Tengo dos tablas, que contienen ID y campos de medida. Necesito tomar valores de trazo por trazo del campo 1 (tabla 1) y encontrar todos los valores en el campo 1 (tabla 2) que son menores que el valor buscado. Y luego tome el mayor de ellos y póngalo en el campo de trazo2 (tabla1). Ejemplo mostrado en la imagen de abajo.

Será genial, si se tratara de un script en python.

introduzca la descripción de la imagen aquí

3voto

Roy Puntos 2884

Soy un SIG hombre, no un programador profesional, así que estoy seguro de que hay una manera más eficiente para escribir esto. He probado el código siguiente en las maquetas de los datos que usted proporcionó. Usted tendrá que asegurarse de que funciona en un extenso conjunto de datos (de ahí la gran cantidad de comentarios así que usted puede modificar).

Pseudo Código:

  1. Crear un python lista de todos los valores en la tabla 2, utilizando una búsqueda cursor.
  2. El bucle a través de la tabla 1 con una Actualización cursor pruebas en contra de cada valor en su nueva lista.
  3. Si el valor actual en la lista es menor que el valor de la tabla uno, almacenarlo en una variable.
  4. Si el valor actual en la lista es mayor que el valor en la tabla, utilice la variable de la última iteración para actualizar el campo 2.

Secuencia de comandos:

import arcpy

# Put the absolute path to your tables / feature classes
table1 = r"C:\SomePathHere" 
table2 = r"C:\SomeOtherPathHere" 

# Create empty Python list
table2list = []

# Arcpy Search cursor
rows = arcpy.SearchCursor(table2)

# Get a list of all values in table2 field1
for row in rows:
    table2list.append(row.Field1)

# Delete cursor objs
del row, rows

# Sort the list in numeric order, get the highest value
table2list = sorted(table2list)
highestVal = table2list[len(table2list)-1]

# Create update cursor for table1
rows = arcpy.UpdateCursor(table1)

# Nested loop -- for each row in table1 we loop through our list of table2 values
for row in rows:
    # Reset stored value var for each loop
    storedValue = 0
    # If Field1 is less than the smallest value in table2, Field2 is equal to Field1
    if (row.Field1 < table2list[0] and row.Field < 11):
        row.Field2 = 0
        rows.updateRow(row)
    elif (row.Field1 < table2list[0] and row.Field > 10):
        row.Field2 = row.Field1
        rows.updateRow(row)
    # If Field1 is greater than the highest value, Field2 equals highest value
    elif row.Field1 > highestVal:
        row.Field2 = highestVal
        rows.updateRow(row)

    # When the value in the list is greater than Field1, use the last value to update Field2
    for i in table2list:
        if i < row.Field1:
            storedValue = i
        else: # This is where we're actually changing the value of Field2
            row.Field2 = storedValue
            rows.updateRow(row)

del row, rows

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X