Find

Article
· Sep 29 3m read

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 :)

Discussion (0)1
Log in or sign up to continue
Digest
· Sep 29
Question
· Sep 28

InitialExpression Not Working in %CSP.Page Subclass

Hello Community

The InitialExpression keyword values does not to set default values for properties in classes that extend %CSP.Page, unlike in other class types such as %Persistent or %RegisteredObject, where it works as expected during object instantiation (typically via %New()).

  1. Is %CSP.Page instantiated using %New() under the hood, or does it use a different initialization mechanism?
  2. Are there specific limitations or behaviors in CSP pages that prevent InitialExpression from working as expected?

Thank you!

5 Comments
Discussion (5)3
Log in or sign up to continue
Announcement
· Sep 26

[Video] August Developer Meetup Recording - Agentic Orchestration & Multi-LLM Systems

Hey Community,

The InterSystems team recently held another monthly Developer Meetup in the AWS Boston office location in the Seaport, breaking our all-time attendance record with over 80 attendees! This meetup was our second time being hosted by our friends at AWS, and the venue was packed with folks excited to learn from our awesome speakers.

 

The topic of the August meetup was Agentic Orchestration &  Multi-LLM Systems, and our speakers brought some amazing demos: First,  @Nicholai Mitchko demonstrated a financial document analysis using an implementation of a novel multi-LLM approach based on new research. Then, @Jayesh Gupta dove into a survey of approaches to orchestrating agentic systems.

If you weren't able to attend, we've once again recorded both talks from the meetup to make them available virtually. You can find the recorded sessions at the links below:

⏯️ Building Reliable Multi-LLM Systems for Financial Document Analysis

⏯️ Building Agentic Orchestration Systems (and other cool stuff)


 

Discussion (0)1
Log in or sign up to continue
Article
· Sep 26 2m read

Git Pre-commit Hook for Health Connect Cloud

Hi,

Just thought I'd share quite a handy hook that has helped me out when developing on Health Connect Cloud with VS Code and GitBash. When developing on Health Connect Cloud, if changes are made directly on the server such as routing rules or component deployments, they aren't automatically included in source control, therefore you must export from the server into your local files and push to your remote repo. I'm sure there are easier methods to deal with that which I'm in the process of testing, but as a quick solution I thought it would be handy have a pre-commit hook which triggers a reminder in GitBash - see below.

This reminder can be tweaked to mention routing rules and anything you think needs to be considered for export.

The hook code:

#!/bin/bash
# Git pre-commit hook - gentle reminder for Production.cls
targetFile="src/HCC/Connect/Production.cls"
# Check if Production.cls is already staged
staged=$(git diff --cached --name-only | grep "$targetFile")

# If Production.cls is not staged, show a gentle reminder
if [ -z "$staged" ]; then
    echo ""
    echo "💡 Gentle reminder: Have you made any changes to the Production class on the server?"
    echo ""
    echo "   If YES: Export and add $targetFile to this commit"
    echo "   If NO:  Continue with: git commit --no-verify"
    echo ""
    echo "   (This reminder appears on every commit - use --no-verify to skip)"
    echo ""
    exit 1
fi
# Production.cls is staged, proceed normally
exit 0

I hope this is useful for anyone developing with Health Connect Cloud.

 

Jordan

1 Comment
Discussion (1)2
Log in or sign up to continue