Tabular es una biblioteca en C, con un programa de consola, que lee tablas de datos en columnas, las interpola y las extrapola, en forma lineal o por spline (curva suavizada). La versión actual en este árbol es tabular2 2.0-18 (octubre de 2026); la anterior, tabular 1, se distribuía como simusol_table.
La usan Simusol y SCEPTRE (función ETABLE), Siru y ExprTk (función Table()) y Calcula (función tabla()).
Puede usarla cualquiera que quiera procesar tablas, interpolarlas o convertir formatos, por ejemplo: archivos gnuplot, csv, los binarios de SCEPTRE, del primero al último, archivos de spice, y los .simul de sceptre-simusol.
Un archivo de texto con columnas de números separadas por blancos, tabuladores o comas, y un renglón de nombres arriba, con # o sin él:
# t T p
0 20 101325
60 25 101000
Además lee, tal como los escriben los programas que los producen:
.simul) y lo de SCEPTRE pasado a columnas;datos.dat el primero, datos.dat#2 el segundo...);; y coma decimal (el de una planilla en castellano: 1,5;2,5);.print (con sus páginas y encabezados repetidos), wrdata y el archivo raw ASCII, donde cada análisis es una tabla y una variable compleja da dos columnas, NOMBRE.re y NOMBRE.im;TABLE de un circuito de SCEPTRE, en pares x, y, como se la pasa Siru.Si debajo del renglón de nombres hay otro cuyas palabras son todas unidades, los valores de cada columna se pasan al SI al leer la tabla (- es una columna sin unidad):
# t T p n
# min tempC mmHg -
0 20 760 1
queda en segundos, kelvin y pascales. Las unidades son las de GNU units, que Tabular usa como biblioteca (libunidades).
Las duraciones numéricas pueden llevar unidades de tiempo, como s, min, hr o day: con un renglón de unidades se convierten al SI, en segundos.
Fecha y hora completas se convierten a epoch Unix: segundos desde 1970-01-01T00:00:00Z, conservando fracciones de segundo. Si la entrada no especifica zona, se toma la de la máquina donde se ejecuta, o TZ si está definida. Si trae Z o un desplazamiento como -03:00, se respeta.
Una fecha sin hora usa medianoche. Una hora sin fecha es una duración en segundos desde medianoche, no un instante epoch. Las horas locales inexistentes por cambios estacionales se rechazan; para una hora ambigua, indicar el desplazamiento explícito. Las marcas deben ocupar una celda: usar ISO con T en tablas separadas por blancos, o fecha y hora dentro de una celda CSV.
Esto requiere libmem-util0 2017.2.1.R1008-2 o posterior, que se instala con summapack (ver Instalación); con la versión anterior, 1.0-2, las fechas pierden la hora.
Repetir un valor de la columna x, dos o tres veces, es una discontinuidad: antes vale el valor de la primera fila, despues el de la segunda, si son dos, o el de la tercera, si son tres, y en el punto el promedio o el valor de la fila del medio, si son tres. La spline se arma por tramos y conserva el salto.
Son tres paquetes:
libtabular2-0: la biblioteca;libtabular2-dev: los encabezados y el archivo de pkg-config;tabular: los programas interpola y sceptre-tabular.Se instala con Summapack.
Hay entregas para distintas distribuciones y formatos. Hay que elegir paquetes compatibles con la distribución y arquitectura de la máquina; que exista un formato DEB, RPM o TGZ no significa que un mismo binario funcione en todos los sistemas. En una terminal:
curl -fsSLO https://www.simusol.org/downloads/installsumma.sh
sh installsumma.sh tabular2
Pregunta qué bajar, mostrando lo que hay: fuentes para compilar en la máquina, deb para Ubuntu y Debian, rpm para Fedora y openSUSE, tgz para Arch y las demás (también se puede decir de antemano: sh installsumma.sh --para fuentes tabular2). Instala summapack, la herramienta de Simusol para bajar e instalar paquetes, y Tabular con todo lo que necesita: las bibliotecas de Simusol que falten (libslex, libunidades, libmem-util), las del sistema y gnuplot para graficar. Comprueba el md5 de cada archivo e instala con el sistema de paquetes de la distribución; pide permiso mediante sudo. Para instalar solo el programa, sin los archivos de desarrollo: sh installsumma.sh tabular2/tabular. Se usa el mismo instalador aunque SummaPack ya esté instalado.
Los DEB 2.0-18 comprobados aquí se construyeron en Ubuntu 24.04 y requieren libc6 >= 2.38; no sirven como binarios para Ubuntu 22.04, cuya glibc es anterior. La disponibilidad y compatibilidad de lo publicado deben comprobarse para cada entrega. Si no hay un binario compatible, se puede instalar desde las fuentes (fuentes) y compilar en la máquina de destino.
No instala Simusol, Siru, Calcula ni SCEPTRE.
Los paquetes están en https://www.simusol.org/downloads/, cada uno en el directorio de su proyecto (tabular2/, slex/, unidades/, summapack/); las versiones anteriores, en el subdirectorio otros/ de cada proyecto.
Dependencias directas de los DEB 2.0-18 para amd64 construidos en Ubuntu 24.04; corresponden a estos archivos concretos, no a cualquier compilación de otra distribución.
| Paquete | Dependencias obligatorias |
|---|---|
libtabular2-0 |
libmem-util0 >= 2017.2.1.R1008-2, libslex0 >= 1.0-25, libunidades0 >= 1.0 y libc6 >= 2.38. |
libtabular2-dev |
libtabular2-0 = 2.0-18, libmem-util-dev >= 2017.2.1.R1008-2, libslex-dev y libunidades-dev. |
tabular |
libtabular2-0 >= 2.0-18, libslex0 >= 1.0-25, libunidades0 >= 1.0, libreadline8t64 >= 6.0, libc6 >= 2.38 y python3. |
gnuplot; el paquete tabular lo recomienda y apt normalmente instala las recomendaciones.build-essential y debhelper-compat (= 13)), autoconf, automake, libtool, pkg-config, bison, python3, libmem-util-dev, libslex-dev, libunidades-dev, libexprtk-dev y libreadline-dev.Tabular no depende de Calcula ni de Siru para funcionar: son esos programas los que utilizan Tabular.
| Origen | Cómo se carga |
|---|---|
| Archivo | En la consola, leer archivo.csv; desde C, interpolate("archivo.csv", ...) carga la tabla al necesitarla. create_search_table permite cargarla explícitamente. |
| Cadena de texto en memoria | create_table_from_string(nombre, texto, &nt) registra una tabla con el mismo formato textual que un archivo, sin escribir un archivo intermedio. Después se usa ese nombre con interpolate. |
| Tabla embebida en un modelo | Calcula admite la sección tablas del .din; Siru entrega las TABLE del circuito a Tabular. |
Por ejemplo, la cadena "# T R\n0 100\n10 50\n20 30\n" define tres filas y dos columnas. El nombre registrado identifica la tabla y su extensión selecciona el tratamiento CSV cuando corresponde. Si el nombre ya está cargado, se conserva la tabla anterior: volver a registrarlo no la reemplaza.
Ver el ejemplo tanqueT.dia en simusol_ejemplos/simples.
Cuando se necesita el valor de la tabla se invoca la función
ETABLE(NUM TABLA, COLUMNA X, COLUMNA Y, VALOR X, FORMA DE INTERPOLACION)
Las columnas se indican con números, empezando por 0. La forma de interpolación es 1, lineal, o 2, spline (suavizada).
NUM TABLA se indica en un cuadro adicional llamado ETABLE: cada línea tiene el número de la tabla y el nombre del archivo que la contiene, relativo al directorio donde se ejecuta Simusol.
ETABLE está escrita en Fortran y llama a tabular2: se compila con el programa que genera SCEPTRE y se enlaza con -ltabular2. Si la tabla da un error, lo informa y detiene la simulación en lugar de seguir con un valor inventado.
Guardar este programa completo como ejemplo2.c:
#include <stdio.h>
#include <stdlib.h>
#include <interpola.h>
#include <tables.h>
/* Globales requeridas por la biblioteca. */
int verbose = 0;
char *archivoenuso = "datos.txt";
int main(void)
{
double r = 0.0;
int e = interpolate("datos.txt", "UNO", "DOS", 550.0, 2, &r);
if (e != 0) {
fprintf(stderr, "%s: %s\n", tb_mensaje(e), tb_detalle());
free_tablelist();
return EXIT_FAILURE;
}
printf("DOS(550) = %.17g\n", r);
free_tablelist();
return EXIT_SUCCESS;
}
Guardar también este archivo como datos.txt en el directorio desde el que se ejecutará el programa:
# UNO DOS
0 0
300 30
600 60
900 90
1200 120
"datos.txt" es el archivo; "UNO" es el nombre de la columna que hace de dominio y "DOS" el de la que hace de codominio, los dos del renglón de nombres; 550. es el valor buscado en la columna UNO; 2 pide spline (1, lineal); el resultado queda en r. Devuelve 0 si pudo; si no, tb_mensaje y tb_detalle dicen qué pasó (qué columna, qué renglón).
interpolate_file_num hace lo mismo con las columnas por número;create_table_from_string registra una tabla escrita en una cadena, que después se usa como un archivo;ARCHIVO#2 es el segundo bloque de un archivo de gnuplot.Con gcc y pkg-config instalados, y libtabular2-dev (lo instala sh installsumma.sh tabular2), compilar y ejecutar:
gcc -std=c11 -Wall -Wextra ejemplo2.c -o ejemplo2 $(pkg-config --cflags --libs tabular2)
./ejemplo2
Con estos datos el resultado es DOS(550) = 55, salvo redondeo numérico. El programa informa los errores por la salida de errores, devuelve un estado distinto de cero si falla y libera las tablas antes de terminar.
La biblioteca puede usarse desde varios hilos: cada hilo tiene sus propias tablas cargadas, y con tb_ctx_nuevo y tb_ctx_usar un mismo hilo puede llevar lecturas separadas.
En una expresión de ExprTk (y así en Siru) es la función
Table('archivo.txt', 'X', 'Y', valor, metodo)
y en los .din de Calcula, tabla('archivo.txt', 'X', 'Y', valor, metodo). En un .din la tabla también puede ir adentro del mismo archivo, en la sección tablas. Siru le pasa a Tabular las TABLE de un circuito de SCEPTRE.
Es una consola (con historial y completado) para mirar e interpolar tablas sin escribir un programa:
$ interpola datos.txt
interpola> columnas
interpola> x t
interpola> metodo spline
interpola> interpolar 90 T p
interpola> inversa T 300
interpola> integ 0 120 p
interpola> saltos 0 120 10 > cada10.txt
interpola> graficar T
Lee varias tablas, interpola en cualquier columna, busca al revés dónde una columna toma un valor, calcula valor medio, valor eficaz e integral entre dos abscisas, rehace la tabla a paso fijo y la grafica con gnuplot. También corre órdenes sin preguntar: interpola datos.txt -e 'x t; interpolar 90'. Con man interpola está la lista completa.