Tablas a partir de datos

Cuando el contenido de una tabla ya existe como datos externos, por ejemplo en un archivo .csv, no hace falta volver a teclear cada celda a mano. LaTeX tiene varios paquetes que leen CSV y los convierten en tablas, así que la fuente no tiene que reescribirse cuando cambian los datos. Esta página presenta tres, con criterios para elegirlos: el rápido csvsimple, el potente en formato pgfplotstable y el enfoque de base de datos de datatool. Al final aparece la columna S de siunitx para alinear números por el punto decimal (la columna S se explica por completo en la página “Unidades (siunitx)”).

Por qué crear tablas a partir de datos

Los resultados experimentales y las tablas de resumen casi siempre salen de una hoja de cálculo o de un instrumento como CSV (valores separados por comas). Copiarlos a mano en celdas de tabular es tedioso y propenso a errores: cada fila añadida y cada dígito cambiado obliga a editar de nuevo el manuscrito.

La idea puede invertirse: dejar los datos en un archivo de datos y limitarse a decirle a LaTeX que los lea y los componga. Así basta con actualizar los datos y recompilar para que la tabla se actualice. Con un único CSV fuente puedes reutilizar los mismos números en el cuerpo, las diapositivas y un apéndice tantas veces como quieras, sin errores de transcripción. Esta separación entre datos y presentación encaja con la forma en que LaTeX separa la estructura lógica del aspecto.

Los ejemplos de esta página usan el pequeño archivo CSV siguiente. La primera línea es una fila de encabezado con las columnas product, price y weight; las líneas restantes son los datos.

data.csv
product,price,weight
Apple,380,182.5
Orange,120,95.0
Melon,1280,1450.2

Lectura rápida — csvsimple

csvsimple es un paquete ligero que lee CSV para construir tablas y bucles. Se carga con \usepackage{csvsimple} (la versión actual selecciona internamente la implementación LaTeX3 csvsimple-l3). La entrada más rápida es \csvautotabular{data.csv}: basta con darle el nombre del archivo y vuelca automáticamente todo el CSV en un tabular, usando la primera línea como encabezado con reglas. Sirve para ver el contenido rápidamente en forma de tabla.

latex
\csvautotabular{data.csv}

Esa sola línea produce una tabla de tres columnas y tres filas encabezadas por product, price y weight. Es cómoda, pero sus opciones de formato son limitadas. Cuando quieras decidir la alineación, las reglas y qué columnas conservar, usa \csvreader: es la herramienta principal de csvsimple.

\csvreader toma tres argumentos con la forma \csvreader[options]{data.csv}{assignments}{body}. El segundo argumento es el archivo que se lee, el tercero vincula nombres de columnas con macros y el cuarto indica qué emitir por cada fila. Por ejemplo, price=\price hace que el valor de la columna price esté disponible como \price dentro del cuerpo. La estructura de la tabla se da mediante opciones como tabular= y table head= (fila de encabezado).

latex
\csvreader[
  tabular = l r r,
  table head = \hline Product & Price & Weight \\ \hline,
  late after line = \\]
{data.csv}
{product=\product, price=\price, weight=\weight}
{\product & \price & \weight}

Aquí tabular = l r r declara tres columnas (“izquierda, derecha, derecha”), table head coloca la fila de encabezado y una regla superior, y el cuerpo {\product & \price & \weight} expande cada fila de datos en celdas. late after line = \\ le indica a csvsimple que añada un terminador de fila \\ después de cada línea: es la forma habitual de poner saltos solo entre filas sin dejar uno sobrante tras la última. Si los encabezados contienen espacios o símbolos, también puedes referirte a las columnas por número en el tercer argumento: \csvcoli, \csvcolii, \csvcoliii, … representan el contenido de la primera, segunda y tercera columna.

Por omisión, la primera línea se trata como encabezado y se excluye de los datos. Para leer un CSV sin fila de encabezado, la forma con estrella \csvreader* lee también la primera línea como datos. csvsimple ofrece además filter para seleccionar filas por condición y \csvstyle / \csvnames para reutilizar asignaciones, funciones que van más allá de las tablas y sirven para procesamiento general fila por fila.

Lectura y formato — pgfplotstable

Cuando quieres controlar hasta el aspecto de los números, pgfplotstable es la opción más potente. Forma parte de pgfplots y se carga con \usepackage{pgfplotstable}. Su comando central es uno solo: \pgfplotstabletypeset[options]{data.csv}. Lee el CSV, lo formatea con la precisión y el estilo numérico pedidos, y monta internamente un tabular como salida. Para leer un CSV, declara el separador con col sep=comma.

Todo se controla mediante opciones clave-valor. Estas son las más importantes.

OpciónQué hace
col sep=commacol sep=commaLeer como CSV (separado por comas); por omisión se separa por espacios
headerheader=has colnames / header=falseTratar la línea 1 como nombres de columna / tratarla como sin encabezado
columnscolumns={a,b,...}Seleccionar qué columnas emitir y en qué orden
columns/NAME/.stylecolumns/price/.style={...}Aplicar formato a una columna con nombre
column namecolumn name=EncabezadoSustituir el encabezado impreso de esa columna
fixedfixed, fixed zerofill, precision=nPunto fijo, ceros de relleno, n decimales
scisci, sci zerofillComponer en notación científica (exponencial)
string typestring typeColumna de texto (sin formato numérico)
dec sep aligndec sep alignAlinear la columna por el punto decimal (requiere array)
latex
\pgfplotstabletypeset[
  col sep = comma,
  header = has colnames,
  columns = {product, price, weight},
  columns/product/.style = {string type, column name = Product},
  columns/price/.style   = {column name = Price, fixed, precision = 0},
  columns/weight/.style  = {column name = Weight (g), fixed, fixed zerofill,
                            precision = 1, dec sep align},
]{data.csv}

En este ejemplo, la columna product se configura como string type (texto), price como entero (precision=0) y weight con un decimal y ceros de relleno, alineada por el punto decimal mediante dec sep align. Los encabezados se sustituyen con column name. Los mismos datos cambian su número de cifras con solo cambiar precision: controlar el aspecto de los números independientemente del CSV es justo la fortaleza de pgfplotstable.

pgfplotstable también puede derivar columnas calculadas de las que lee: puedes definir una columna “calculada al usarse” con create on use, o posprocesar valores dentro de columns/.../.style mediante postproc cell content. Es trabajo de hoja de cálculo hecho por completo en LaTeX. Las reglas se ajustan con every head row/.style o con integración de booktabs (una opción que inserta automáticamente \toprule / \midrule / \bottomrule). Toda esa potencia vuelve más pesada la sintaxis, así que una buena regla práctica es pgfplotstable para tablas numéricas elaboradas y csvsimple para CSV → tabla sencillo.

Como base de datos — datatool

El tercer paquete, datatool, lee un CSV como base de datos y destaca en el procesamiento fila por fila, al estilo de una combinación de correspondencia. Se carga con \usepackage{datatool} y luego \DTLloaddb{name}{data.csv} importa el CSV en una base de datos con nombre. Por omisión, la primera línea es el encabezado y sus nombres de columna se convierten en las claves de cada valor. Para un CSV sin encabezado, \DTLloaddb[noheader]{...}{...} nombra las columnas automáticamente como Column1, Column2, ….

Una vez cargado, \DTLforeach{name}{assignments}{body} recorre las filas por orden. Las asignaciones se escriben “macro = nombre de columna”, como en \DTLforeach{db}{\Product=product,\Price=price}{…}, y dentro del cuerpo \Product y \Price se expanden a los valores de esa fila. Para hacer una tabla, ejecuta \DTLforeach dentro de un tabular y termina el cuerpo con el terminador de fila \\.

latex
\DTLloaddb{goods}{data.csv}

\begin{tabular}{l r}
  \hline
  Product & Price \\
  \hline
  \DTLforeach{goods}{\Product=product, \Price=price}{%
    \Product & \Price \\}
  \hline
\end{tabular}

Aquí el CSV se carga como goods, y dentro del tabular \DTLforeach emite “producto & precio” por cada fila. La verdadera fortaleza de datatool es la manipulación de datos más que la composición de tablas: puede sumar y promediar números, ordenar y excluir filas por condición mediante macros, y se usa para generar bibliografías y documentos combinados. En cambio, si solo necesitas convertir un CSV en una tabla, csvsimple es más conciso.

Alinear números por el decimal — la columna S de siunitx

Vengan o no los datos de un CSV, una columna de números tiene el mismo problema: es difícil de leer si las cifras no se alinean. La forma habitual de resolverlo en un tabular escrito a mano es la columna S de siunitx. Escribe S en la especificación de columna en lugar de r u otra, y los números de esa columna se alinean por el punto decimal. Está disponible al cargar \usepackage{siunitx}.

latex
\begin{tabular}{l S[table-format=4.1]}
  \toprule
  {Product} & {Weight / \unit{\gram}} \\
  \midrule
  Apple  &  182.5 \\
  Orange &   95.0 \\
  Melon  & 1450.2 \\
  \bottomrule
\end{tabular}

Aquí la segunda columna es S[table-format=4.1], es decir, “4 cifras enteras y 1 decimal”, y alinea 182.5, 95.0 y 1450.2 por el punto decimal. Hay dos puntos clave. Primero, configura table-format=integer.decimal según el valor más grande de la columna. Segundo, envuelve cualquier texto, como un encabezado de columna, entre llaves {…} para protegerlo ({Weight / \unit{\gram}}). Si olvidas esa protección, siunitx intenta leer el encabezado como un número y la alineación se rompe.

El uso completo de la columna S — especificar table-format, proteger texto, la forma macro \tablenum para usar dentro de \multicolumn y manejar valores con exponentes — se trata en la página “Unidades (siunitx)”. Separar tareas, \qty para cantidades en el texto y la columna S para números en tablas, mantiene coherente el estilo numérico en todo el documento.

Cuál usar

Lo mejor es elegir según el objetivo. Esta es una guía aproximada.

  • CSV sencillo → tabla: csvsimple. \csvautotabular para una tabla inmediata; \csvreader para controlar alineación y reglas.
  • Ajustar cifras, estilos numéricos o columnas calculadas: pgfplotstable. El más potente, pero con sintaxis más pesada.
  • Manipulación de datos como objetivo principal — sumar, ordenar, procesar condiciones: datatool. También sirve para documentos combinados.
  • Solo alinear una columna de números por el decimal: la columna S de siunitx. Entra directamente en un tabular escrito a mano.

Sea cual sea el método, la base es el mismo vocabulario de tabular: especificación de columnas, &, \\ y reglas. Conviene dominar primero los “fundamentos de tabular” y luego elegir la herramienta según el volumen de datos y el formato necesario.