miércoles, 1 de mayo de 2024

OOo Basic. Datos

Matrices. Creación de  listas de elementos

Una de las tareas que hay que realizar para crear una colección de datos o matriz, es asignar contenido a sus elementos. Si la matriz contiene muchos elementos, esta tarea puede llevar cierto tiempo empleando el procedimiento básico de asignación. Como vimos en una [entrada anterior] la instrucción Array() ahorra tiempo y acorta sensiblemente el número de líneas de código, pero resulta un tanto tedioso crear un listado extenso.


En esta entrada te explico un procedimiento de trabajo que te ahorrará tiempo a la hora de crear estos listados, siempre y cuando su extensión sea lo suficientemente amplia como para que merezca la pena.

Cuando tenemos que crear una matriz con los Id de un test que tiene 50 ítem, cada uno de los cuales se identifica mediante un Id. o cuando el test consta de varias pruebas (5 por ejemplo), cada una de las cuales tiene un número de ítem suficientemente grande, por ejemplo, entre 25 y 40 ítem con sus respectivos Id, en ambos casos (y en otros que se nos puedan dar) la asignación de los elementos a la(s) matriz(es) supone un considerable tiempo de trabajo, tanto si realizamos la asignación de forma directa (mDatos(0) = "Fe1"como si empleamos la instrucción Array() (1), así que merece la pena aplicar algún "truco" que simplifique la tarea.

La forma más sencilla de crear este tipo de Array es utilizar Calc (2):
  • Crear un documento Calc
  • Introducir el primer valor Id en la celda A1 (Id1)
  • Seleccionar esa celda y arrastrar hacia la derecha desde el borde inferior derecho hasta completar la serie (3)
  • Ejecutar la secuencia Archivo | Guardar como | Tipo | CSV (formato) | Guardar
  • En la ventana emergente clic en Usar formato Texto CSV
  • En la nueva ventana emergente seleccionar (o mantener las opciones siguientes:
    • Delimitador de campos -> [,]
    • Delimitador de cadena -> ["]
    • Guardar contenido de la celda como se muestra
    • Entrecomillar todas las celdas de texto
  • Aceptar
  • Archivo | Cerrar
  • Abrir el archivo CSV antes creado desde Blog de notas
  • Seleccionar todo el contenido (se mostrará como una línea de texto con los elementos entrecomillados y separados por comas)...
  • Y pegar en el script, entre el paréntesis de Array()
Aunque  este procedimiento pueda parecer algo lioso, esto se debe a la descripción pormenorizada de cada uno de sus pasos, pero es muy sencillo en realidad, especialmente porque los pasos a dar son sobradamente conocidos y practicados en el uso ordinario de cualquier servicio.

Involucra, eso sí, varias herramientas (Calc y Blog de notas fundamentalmente) obligatoriamente, ya que no podemos usar Writer para crear/exportar al formato CSV y necesitamos abrir el archivo CSV con Blog de notas porque nos permite acceder directamente al formato que nos interesa (elementos entrecomillados y separados por comas) por ser compatible con el que requieren las variables string en OOo Basic (4)

Este modo de alimentar nuestras matrices puede ser útil cuando el número de elementos es relativamente elevado, como ya dijimos, porque la escritura en Calc de la serie está prácticamente automatizada por la secuencia seleccionar->arrastrar, pero también lo es cuando disponemos de una base de datos de cierta envergadura y deseemos tenerla disponible como matriz o matrices para manejarla(s) directamente desde un script. En este segundo caso (quizá más interesante aun que el primero), la conversión a CSV agiliza enormemente el proceso, ya que evita el acceso a la base de datos (la hoja Calc), aunque incrementa peso del script (5).

Volviendo a las series simples que dieron origen a esta entrada, también podemos generarlas directamente mediante código sin necesidad de escribir el array ni asignar manualmente contenidos a la matriz.

Dado que nuestra intención es crear un Id como valor string, en el IDE creamos el script con una matriz tipo String (Dim mDatosId (49) As String) y una variable Integer (Dim i As Integer) que usaremos como contador. A continuación creamos el siguiente bucle:
For i= 0 To 49
mDatosId(i) = "Id" & CStr(i)
Next

Este bucle genera valores string que inician en Id0. Si lo que deseamos es que se inicie con el valor Id1 sólo tenemos que sustituir la expresión CStr(i) por CStr(i+1). De igual modo podemos crear una matriz con una serie numérica y/o cronológica (años), aunque necesitaremos cambiar el tipo de matriz a Integer, salvo que deseemos tratar los números como string. En caso contrario, también omitiremos la función de conversión y el string inicial (v.g., "Id" & CStr(i) -> 1900 +i, que permite crear una serie cronológica que inicia en 1900 y finalizar en 1949 para i=0 To 49)

Posiblemente esta última fórmula sea la más apropiada cuando deseamos crear una matriz de elementos cuasi-numéricos que guardan una relación de sucesión incremental (o decremental, que también es posible), pero no debemos despreciar las posibilidad que nos el uso combinado de Calc y Bloc de notas y la conversión del archivo a CVS. Nos va a ser especialmente útil cuando dispongamos de bases de datos Calc (o simplemente tablas) de cierta entidad.


NOTAS

(1) La instrucción Array() puede ser muy útil cuando el contenido del elemento es breve, como en el caso de un Id, un valor numérico, una palabra..., pero resulta engorroso cuanto el contenidos es un conjunto de frase (como el enunciado de los ítem). En todo caso lo que sí supone es un ahorro significativo de líneas de código. Que lo sea también de trabajo no está tan claro.

(2) Calc permite crear fácilmente listados y convertirlos al formato CSV. Para crear un listado en Writer necesitamos crear primero una tabla, pero su mayor limitación para nuestro objetivo es que no crear documentos CSV.

(3) Aunque tenemos la opción de crear una columna en lugar de una fila, para nuestro objetivo (crear un array), deberemos trabajar sobre la fila, según veremos en breve. De este modo se genera automáticamente una sucesión alfanumérica (Id1,Id2,Id3...). Cuando seleccionamos A1, el puntero se visualiza como una cruz al situarnos en el ángulo inferior derecho (cuadradito). A partir de ese momento, manteniendo pulsado el botón izquierdo del ratón, podremos "extender" la fila hasta completar la serie. Si nos detenemos antes de alcanzar el Id final, podremos retomar la creación de la serie desde el último ítem introducido, repitiendo el proceso descrito.

(4) En caso de valores numéricos, por ejemplo años sucesivos, CSV devuelve una fila de números separados por comas, pero no entrecomillados. Estos datos son adecuados para matrices tipo integer. Si deseamos tratar esas fechas como datos alfanuméricos, en Calc deberemos establecer la celda como de texto antes de escribir el primer elemento de la serie y mantener la opción Entrecomillar texto al transformar a CSV. En ese caso forzamos a que los números sean string y se presentarán entrecomillados al abrir el archivo desde Bloc de notas.

(5) El acceso directo a la base de datos es precisamente el modo alternativo al que se explica en la entrada en este punto de su desarrollo. Presenta ventajas, pero también inconvenientes. Optar por crear las matrices con su contenido explícito o crear un procedimiento de acceso a la base de datos desde código serán opciones que se deberán sopesar al crear el docap.

No hay comentarios:

Publicar un comentario

Comenta esta entrada

Nota: solo los miembros de este blog pueden publicar comentarios.