Artículo
· 4 hr atrás Lectura de 3 min

Importar datos CSV en InterSystems IRIS y preservar los IDs

¡Hola a todos!

Es muy fácil importar datos CSV en IRIS. Pero, ¿qué pasa si queremos preservar los IDs originales del CSV?

Recientemente me encontré con la situación en la que necesitaba importar dos CSVs en IRIS que estaban vinculados por una columna que hacía referencia a la columna de otro CSV: una situación típica de clave primaria y clave externa, donde csv1 contiene esta columna como clave primaria, y csv2 como clave externa con IDs relacionados con csv1.

La imagen fue generada por ChatGPT, así que no lo culpéis: hizo lo mejor que pudo al generar países como claves primarias con una relación countries.csv–cities.csv :)

Conozco al menos tres utilidades prácticas para importar CSV: csvgencsvgen-python, y bdb-sql-utils. Pero si importo ambos CSVs, por ejemplo mediante csvgen, habrá dos clases en IRIS con los datos importados, un ID interno generado y un IDKey. Y no es posible cambiar el IDKey a otro índice en la clase una vez que ya tiene datos. Así que resulta que no es tan obvio cómo importar un CSV y preservar una columna con datos de ID como IDKey en IRIS.

Por supuesto que es posible, y estoy seguro de que conocéis muchas maneras de hacerlo. De hecho, ahora es posible importar y preservar los IDs existentes en el CSV como claves ID tanto en csvgen como en csvgen-python. Para generar una clase en IRIS e importar datos desde un CSV dado con una clave primaria, proporcionad el nombre de la columna en el parámetro pkey (el último). De este modo, la utilidad añadirá un índice IDKey, PrimaryKey a la clase.
Por ejemplo, si importamos countries.csv y queremos que la columna Name sea un IDKey y clave primaria, llamad a csvgen de la siguiente manera:

//primary key name is the 11th parameter :)
zw ##class(community.csvgen).Generate("path/to/countries.csv,",","package.Countries",,,,,,,,"Name")

Lo que hace internamente puede describirse de la siguiente manera:

  • genera la clase con las propiedades como siempre,
  • borra todos los datos,
  • elimina el índice DDLBEIndex bitmap si existe (esto impide crear un IDKey alternativo al ya existente),
  • establece (temporalmente) la opción global del sistema DDLPKeyNotIDKey=0,
  • añade un índice Primary Key para la columna indicada con el nombre proporcionado.

Y como resultado, tendréis una clase recién generada con datos y la clave primaria IDKey para el nombre de columna dado.

Aquí está el código en csvgen.

Entonces, ¿cómo conectáis dos clases generadas? En mi caso necesitaba tener swizzling de instancias de class1 en class2.property. Así que simplemente cambié el tipo de dato en la clase generada a una clase con Primary Key–IdKey.

Aquí está la aplicación demo de ejemplo que analiza el consumo de patatas y la importación en distintos países (no me preguntéis por qué inventé este ejemplo; quizá tenía hambre). Los países son reales, pero el consumo fue generado por gpt, él/ella dijo que está cercano a la realidad, ya que resultó bastante difícil conseguir estos datos.

Aquí están countries.csv y potatos_sales.csv.

Así es como importo los datos y genero las clases:

    zpm "install csvgen"
    set file="/home/irisowner/dev/data/countries.csv"
    zw ##class(community.csvgen).Generate(file,",","esh.csvpkey.Countries",,,,,,,,"Name")
    set file="/home/irisowner/dev/data/potato_sales.csv"
    zw ##class(community.csvgen).Generate(file,",","esh.csvpkey.Potatos",,,,,1)

Genera una clase countries con PrimaryKey:

Class esh.csvpkey.Countries Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {irisowner}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = Countries ]
{

Property Name As %Library.String(MAXLEN = 250) [ SqlColumnNumber = 2 ];
Property Code As %Library.String(MAXLEN = 250) [ SqlColumnNumber = 3 ];
...

Index COUNTRIESPKEY1 On Name [ IdKey, PrimaryKey, SqlName = COUNTRIES_PKEY1, Unique ];
...

}

Luego cambié la propiedad generada countries de %String a referencia a la clase countries:

Property Country As esh.csvpkey.Countries [ SqlColumnNumber = 2 ];

Y he creado una demo muy evidente de IRIS BI/DSW para ver cómo va el consumo de patatas en los distintos países a lo largo de los años:

Espero que os fuera interesante y os sirviera de ayuda :)

Comentarios (0)1
Inicie sesión o regístrese para continuar