Puede hacerlo utilizando la herramienta Calcular valor (gestión de datos) y algo de magia de Python. Consulte también esta pregunta relacionada: ¿ Agregar código arbitrario al generador de modelos Arcgis?
Una variable de valores múltiples es solo una cadena de valores delimitada por punto y coma, por lo que la multivaluesToCsv
función siguiente es dividir las variables de valores múltiples en listas y transponerlas en filas que luego se escriben en un archivo de texto CSV (valores separados por comas) .
Los iteradores de modelos ejecutan TODOS los procesos en el modelo una vez por iteración; esto no es deseable para nuestra herramienta Calcular valor, que solo queremos ejecutar una vez al final. La forma de lograr esto es creando otro modelo externo para envolver el modelo interno original. Esto se discute en el tema de ayuda Integración de un modelo dentro de un modelo .
Esto es lo que debe hacer para que esto funcione:
Modelo interno : Itera las clases de entidad, las procesa y recopila valores:
- En su modelo original, que será nuestro modelo "interno", agregue otra herramienta Recopilar valores para recopilar los
Name
valores de la variable y así poder asignar los valores de la estadística de distancia a sus nombres de clase de entidad correspondientes.
- Exponga las variables de entrada y salida como parámetros del modelo (haga clic con el botón derecho en un óvalo y verifique el Parámetro del modelo). Haga esto para cada una de las salidas de las herramientas Recopilar valor, así como para cualquier parámetro de entrada que necesite, como el Espacio de trabajo de entrada.
- Guarde y cierre el modelo interno.
Modelo externo : ejecuta el modelo interno, ejecuta la herramienta Calcular valor solo una vez cuando se completa el modelo interno:
- Cree un nuevo modelo: este será nuestro modelo "externo".
- Agregue una variable de tipo
Folder
que le permita especificar dónde crear el archivo CSV de salida.
- Agregue una variable de tipo
String
que le permita especificar el nombre del archivo CSV de salida.
- Agregue el modelo interno al nuevo modelo (arrastre y suelte desde ArcToolbox o haga clic con el botón derecho y agregue datos o herramienta, busque el modelo interno y haga clic en Agregar)
- Cree variables para cualquier parámetro del modelo interno que desee poder establecer desde el modelo externo, como el Espacio de trabajo de entrada (haga clic con el botón derecho en el modelo interno y elija Crear parámetro de variable a partir de).
- Agregue la herramienta Calcular valor al nuevo modelo
Pegue lo siguiente en los cuadros apropiados de la herramienta Calcular valor:
Expresión :
multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
- Esto utiliza la sustitución de variables en línea para pasar las variables del modelo a la función. Ajuste para que coincida con los nombres de variables de su modelo.
- Lo
r
anterior "%Output CSV File Location%"
es significativo: esto indica que se trata de una cadena sin formato ; Debido a que las rutas del sistema de archivos de Windows generalmente contienen barras invertidas (un carácter de escape en Python), tenemos que usar esto para evitar que Python malinterprete las barras invertidas y los caracteres posteriores como secuencias de caracteres especiales.
- Asegúrese de poner comillas alrededor de las variables en línea porque sin ellas Python pensará que son identificadores en lugar de cadenas.
Bloque de código:
import os, csv
def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
ext = 'csv' # Define output file extension (e.g. csv or txt)
header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
# Join CSV file path and name, adding extension if necessary
csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
# Open text file for writing
with open(csvfile, 'wb') as f:
w = csv.writer(f)
w.writerow(header) # Write header row
rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
w.writerows(rows)
return csvfile
(Opcional) Exponga las variables de entrada y salida como parámetros del modelo si desea poder ejecutarlas desde el cuadro de diálogo de herramientas del modelo o encadenarlas junto con otros modelos / scripts. El único resultado del modelo externo es el archivo CSV.
- (Opcional) Conecte las variables de entrada y las salidas del modelo interno a la herramienta Calcular valor como condiciones previas. No creo que esto realmente tenga ningún efecto, solo aclara visualmente lo que está sucediendo.
He probado esto con ModelBuilder y lo he puesto a funcionar (ver capturas de pantalla).
Modelo interno :
Modelo exterior:
El modelo interno ejecuta todos sus procesos una vez por clase de entidad, y luego la herramienta Calcular valor se ejecuta una vez al final para generar el archivo CSV una vez y solo una vez.