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.
product,price,weight
Apple,380,182.5
Orange,120,95.0
Melon,1280,1450.2Lectura 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.
\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).
\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ón | Qué hace | |
|---|---|---|
col sep=comma | col sep=comma | Leer como CSV (separado por comas); por omisión se separa por espacios |
header | header=has colnames / header=false | Tratar la línea 1 como nombres de columna / tratarla como sin encabezado |
columns | columns={a,b,...} | Seleccionar qué columnas emitir y en qué orden |
columns/NAME/.style | columns/price/.style={...} | Aplicar formato a una columna con nombre |
column name | column name=Encabezado | Sustituir el encabezado impreso de esa columna |
fixed | fixed, fixed zerofill, precision=n | Punto fijo, ceros de relleno, n decimales |
sci | sci, sci zerofill | Componer en notación científica (exponencial) |
string type | string type | Columna de texto (sin formato numérico) |
dec sep align | dec sep align | Alinear la columna por el punto decimal (requiere array) |
\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 \\.
\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}.
\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.\csvautotabularpara una tabla inmediata;\csvreaderpara 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
Sdesiunitx. Entra directamente en untabularescrito 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.