Leyendo archivos Excel usando Python Embedded
Python Embedded es una gran herramienta considerando la simpleza y gran cantidad de librerías disponibles, así como una gran comunidad de desarrolladores con toneladas de ejemplos y documentación.
En el siguiente ejemplo les presento una solución para un problema común utilizando Python y ObjectScript.
Un caso de uso muy común es recuperar data desde planillas excel y poblar un objeto persistente en nuestro modelo en IRIS.
para esto utilizaremos pandas, una popular librería Python que nos permite trabajar con DataFrames
En primer lugar instalaremos dicha librería y sus dependencias utilizando ./irispip
RutaAIrisBin> .\irispip.exe install pandas
RutaAIrisBin> .\irispip.exe install xlrd
RutaAIrisBin> .\irispip.exe install openpyxl
Una vez finalizada la operación podemos comenzar:
1.- Crearemos una clase persistente en IRIS, es este caso con 2 propiedades Marca y Precio (trabajaremos con una planilla Excel con marcas y precios de vehículos).
2.- Dentro de nuestra Clase definimos un método Python para leer el archivo, convertirlo en DataFrame y luego transformarlo a json. Lo cual devolveremos para posterior proceso en ObjectScript.
Method ReadXlsx(file As %String) [ Language = python ]
{
import pandas as pd
import json
df = pd.read_excel(file)
result = df.to_json(orient="split")
parsed = json.loads(result)
return(json.dumps(parsed))
}
3.- Ya con nuestra data en json, la recibimos en ObjectScript como DynamicObject, iteramos sobre ella . A continuación creamos una instancia de nuestra clase persistente, asignamos valores y guardamos
Method GetData(file)
{
set dataJson = ##class(%DynamicObject).%FromJSON(..ReadXlsx(file))
zw dataJson.data
set iterator = dataJson.data.%GetIterator()
while iterator.%GetNext(.key, .value) {
w key _ " " _ value.%Get(0) _ " "_ value.%Get(1),!
set fila = ##class(Test.ReaderXls).%New()
set fila.Marca = value.%Get(0)
set fila.Precio = value.%Get(1)
do fila.%Save()
k fila
}
}
4.- Finalmente ejecutamos nuestra clase y tendremos los datos en nuestro modelo.
set a = ##class(Test.ReaderXls).%New()
do a.GetData("C:\Proyectos\autos.xlsx")
Acá les dejo la clase completa y espero que esta información les sea de utilidad
Class Test.ReaderXls Extends %Persistent
{
Property Marca As %String(MAXLEN = 50);
Property Precio As %String(MAXLEN = 50);
Method ReadXlsx(file As %String) [ Language = python ]
{
import pandas as pd
import json
df = pd.read_excel(file)
result = df.to_json(orient="split")
parsed = json.loads(result)
return(json.dumps(parsed))
}
Method GetData(file)
{
set dataJson = ##class(%DynamicObject).%FromJSON(..ReadXlsx(file))
zw dataJson.data
set iterator = dataJson.data.%GetIterator()
while iterator.%GetNext(.key, .value) {
w key _ " " _ value.%Get(0) _ " "_ value.%Get(1),!
set fila = ##class(Test.ReaderXls).%New()
set fila.Marca = value.%Get(0)
set fila.Precio = value.%Get(1)
do fila.%Save()
k fila
}
}
}