
La semana pasada, Fabio Vettore publicó esta entrada de blog sobre la carga de un archivo CSV en SAP Build Apps y luego en un backend de Visual Cloud Functions. Esto me intrigó porque estaba planeando hacer una importación de CSV a una aplicación en la que estaba trabajando, pero pensé en hacerlo de una manera que no incluyera la carga de archivos, la conversión de archivos y JavaScript personalizado. Terminé ayer y quería mostrar mi solución simplista.
Como contexto, estoy creando una aplicación de preguntas frecuentes que tiene dos entidades de datos: preguntas y etiquetas. Cada pregunta puede tener varias etiquetas, y mi lógica verifica si las etiquetas existen y crea otras nuevas para la pregunta si no las hay. Este tipo de datos relacionales o anidados hace que parte de mi lógica sea más compleja de lo que sería en un caso en el que las etiquetas solo serían texto sin formato en lugar de objetos con la opción de agregar sinónimos para una etiqueta más adelante para mejorar la funcionalidad de búsqueda.
Para empezar, esto es lo que sucede cuando un usuario ingresa a esta página (ver vídeo):
La realización más simple aquí es lo que es CSV: Valores Separados por Comas. Por lo tanto, puedo dividirlo fácilmente usando el DIVIDIR fórmula en listas de textos, que luego puedo convertir para satisfacer mis necesidades.
Cuando el usuario presiona el botón «Convertir CSV a JSON», ocurre la siguiente lógica:
Captura de pantalla de mi lógica adjunta al botón
Ya que necesito tener el encabezados o nombres de columna para una funcionalidad posterior, los divido en su propia variable de página.
Aquí puede ver la fórmula SPLIT ya en acción, ya que primero separo la primera línea o fila del CSV separándola del salto de línea (\n). Solo necesito la primera fila, así que la selecciono con [0]. Luego lo dividí nuevamente para obtener una lista ordenada de textos, donde cada texto es el nombre de la columna.
SPLIT(SPLIT(pageVars.input, "\n")[0], ";")
El siguiente paso podría omitirse, pero hago una división similar, elimino la primera fila con los encabezados y guardo esto en el filas página variable para mayor claridad. Tenga en cuenta que no divido las filas en listas de textos en este punto, sino que lo hago en el siguiente paso.
MAP(REMOVE_ITEMS_AT(SPLIT(pageVars.input, "\n"),0), item)
Entonces ocurre la magia: la conversión del CSV al formato JSON.
Me encanta el MAPA fórmula. Es básicamente un bucle for-each y lo uso todo el tiempo.
Aquí lo estoy usando para recorrer las filas, y para cada fila que uso REDUCE_INIT para convertir el texto que tiene la fila en un objeto. La fórmula REDUCE_INIT repite los encabezados que separé de las filas anteriores y, basándose en un objeto vacío (el acumulador), establece pares clave-valor con el valor del encabezado como clave y el valor de la fila como valor.
MAP<row, i>(pageVars.rows, REDUCE_INIT<accumulator, header, index>(pageVars.headers, {}, SET_KEY(accumulator, header, PICK_ITEM(SPLIT(row, ";"), index))))
Y eso es. ¡Los datos están en formato JSON ahora!
Este debería/podría ser también un paso en el que la aplicación verifica si los datos parecen correctos, pero esta es la forma más rápida y sucia, ya que el usuario verifica los datos por sí mismo.
La forma más rápida de ver los datos JSON es simplemente tomar la variable completa en la que está almacenada y usar la fórmula ENCODE_JSON. Hago esto a medida que desarrollo para depurar rápidamente la aplicación todo el tiempo.
ENCODE_JSON(pageVars.csv)
Esto, sin embargo, no es fácil de leer ni de usar, por lo que muestro los datos de esta manera:
Captura de pantalla de la aplicación que hice.
Esto podría hacerse para mostrar todos los datos en el CSV, pero dado que los CSV pueden tener cientos de filas, solo muestro la primera fila de datos para verificar que los encabezados y los valores se alineen correctamente.
Por lo tanto, para mostrar pares de clave y valor en la interfaz de usuario, hice una fórmula que tomó las claves del primer Objeto en la lista y luego obtuvo el valor de esa clave para ese primer Objeto.
MAP(KEYS(pageVars.csv[0]), {key: item, value: LOOKUP(pageVars.csv[0], item)})
No voy a entrar en tantos detalles en este paso, ya que debido al contexto en el que estoy haciendo esto, tengo un bucle de creación anidado más complejo en marcha.
Sin embargo, cada vez que desee realizar operaciones por lotes como crear, deberá hacer lógica de bucle. Mi recomendación es tener una variable que establezca como verdadera cuando la operación esté en curso (y usar esta variable para mostrar un botón giratorio y deshabilitar botones) y otra variable de página para que el índice repita su lógica e incremente con cada ciclo. Una vez más, como un bucle for-each.
Como tengo datos anidados, tengo dos bucles uno dentro del otro.
Captura de pantalla de la lógica compleja que hice para mi creación de datos relacionales para VCF
Ahí lo tiene, una forma de convertir CSV en JSON y luego cargarlo en el backend de su elección. Deje un comentario a continuación con sus pensamientos, preguntas o ideas de mejora, y para otros temas relevantes, consulte el [SAP Builders group]!
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073