Hay veces que me veo en la necesidad de trabajar con tablas dentro de Markdown y trabajar con ellas como si fueran hojas de calculo. No es una cosa que haga habitualmente por lo que suelo buscar y consultar la forma de poder hacerlo.
En una de esas búsquedas encontré este maravilloso manual, me pareció tan bueno, que pensé que seria una buena idea añadirlo como una entrada al El Blog de Lázaro, para tenerlo de referencia y de paso , por si le es de ayuda a alguien más.
Esto es básicamente un copy & paste del documento original Formulas in Markdown Tables de Tony Grosinger
Fórmulas en tablas de Markdown #
El formato de estas fórmulas es muy similar al que se usa en Org mode para GNU Emacs, aunque no es tan potente.
Una breve descripción general de las características:
- Copiar valores de una celda, fila, columna o rango a otro
- Sumar valores de una columna o rango
- Promedio (media) de valores de una columna o rango
- Comparaciones de valores
- Operaciones algebraicas
La estructura de la fórmula: descripción general #
Escribamos una fórmula de ejemplo y familiaricémonos con la estructura antes de aprender los detalles de cualquier característica específica.
Artículo | Gramos |
---|---|
Harina integral | 110 |
Harina de pan | 748 |
Agua tibia | 691 |
Sal | 18 |
Masa madre | 40 |
Total de gramos | 1607 |
<!-- TBLFM: @>$2=sum(@I..@-1) -->
Las fórmulas se agregan a las tablas como un comentario HTML directamente después de la tabla. El formato es <!-- para comenzar el comentario y -->
para finalizar. Tenga en cuenta que hay un espacio entre los guiones y los elementos internos de la fórmula.
A continuación, indicamos que este comentario contiene una fórmula con TBLFM
: . Nuevamente, tenga en cuenta el espacio final. Los componentes hasta ahora existirán sin cambios para cada fórmula que escriba.
Origen y destino #
Ahora llegamos a la parte dinámica de la fórmula. Puede dividir cualquier fórmula en dos mitades: dónde recuperar los datos y dónde almacenar el resultado.
<!-- TBLFM: DESTINATION=SOURCE -->
Por lo tanto, en esta fórmula, estamos recuperando datos de sum(@I..@-1)
y almacenándolos en @>$2
.
Filas y columnas #
Al igual que en org mode, las fórmulas utilizan símbolos para indicar filas y columnas. En la fórmula anterior, el destino de nuestro valor calculado es @>$2
. Podemos desglosar esto en @>
y $2
, que significan “última fila” y “columna 2”. En un minuto, profundizaremos en lo que significa “última fila”.
Veamos la fuente: sum(@I..@-1)
. Nuevamente, si ignoramos algunos de los conceptos que aún no hemos aprendido, podemos identificar algunas filas aquí: @I
y @-1
son filas.
Además de usar números para hacer referencia a filas y columnas específicas (conocidas como filas absolutas o columnas absolutas), se pueden usar símbolos para hacer referencia dinámica a partes de la tabla.
- @< y $< significan la primera fila y la primera columna, respectivamente.
- @> y $> significan la última fila y la última columna, respectivamente.
- @I se refiere a la línea que separa el encabezado de la tabla del cuerpo de la tabla.
También se puede hacer referencia a las filas y columnas en relación con la celda actual que se está completando. Por ejemplo, @-1
significa “la misma columna, una fila arriba” y $+2
significaría “la misma fila, dos columnas a la derecha”.
Al escribir una referencia de celda, si se omite la parte de la fila o columna, significa “en la fila actual” o “en la columna actual”. En nuestro ejemplo, @I
y @-1
han omitido la columna, por lo que estas referencias son para la misma columna que la celda de destino.
Rangos #
Al escribir @2
por sí solo, significa literalmente “fila 2”, es decir, la fila completa. De manera similar, @2$4
significa la celda individual en la fila 2, columna 4. Sin embargo, ¿Qué sucede si desea hacer referencia solo a algunas celdas en una columna, o quizás, a algunas celdas en varias columnas consecutivas?
Los rangos permiten hacer precisamente eso. Un rango se indica mediante dos puntos seguidos entre dos filas y/o columnas.
@I..@-1
Nuestro ejemplo desde el principio dice “Desde la fila después del encabezado en la columna actual, hasta la fila sobre esta en la última columna”.
Funciones #
La última parte de nuestro ejemplo es la llamada de función.
<!-- TBLFM: @>$2=sum(@I..@-1) -->
En este ejemplo, usamos la función sum
y le pasamos el rango descrito anteriormente como datos de entrada. Los detalles de cómo funciona la suma se analizarán más adelante en este documento, pero por ahora podemos decir que suma los datos de entrada proporcionados y proporciona una sola celda como salida.
El resultado #
Con esto, comprendemos todos los componentes de la fórmula de ejemplo. Suma los números de la segunda columna, excluyendo el encabezado y la última fila, y coloca el resultado en la última fila.
Componentes de la fórmula #
En esta sección se explicarán en mayor detalle los diferentes componentes que se pueden utilizar en una fórmula. Algunos detalles se repetirán de la sección de descripción general anterior.
Referencias de celdas y filas #
Las filas siempre se indican con @
y las columnas con $.
Las filas y columnas se pueden especificar como valores absolutos o relativos.
@1
significa la primera fila y @5 significa la quinta fila desde arriba.$1
significa la primera columna y $5 significa la quinta columna desde la izquierda.@<
y$<
significan la primera fila y la primera columna, respectivamente.@>
y$>
significan la última fila y la última columna, respectivamente.@I
se refiere a la primera fila de contenido debajo del encabezado.@-1
significa la fila sobre la celda que se está completando.$+2
significa la segunda columna a la derecha de la celda que se está completando.
Se puede especificar una fila o columna por sí sola o en conjunto en una combinación. Por ejemplo, @5
significa la quinta fila en la columna actual. De manera similar, $5
significa la quinta columna en la fila actual. Cuando se usan juntos, indican una sola celda.
Cuando se usan juntos, la fila siempre debe preceder a la columna.
Rangos #
Con solo filas y columnas, la fórmula se limita a seleccionar celdas individuales o filas y columnas completas. Al usar un rango, una fórmula puede seleccionar filas/columnas parciales, así como múltiples filas/columnas.
Los rangos se crean con una fila y/o columna, dos puntos y otra fila y/o columna. Por ejemplo @1..@3
. Sin embargo, tenga en cuenta que los componentes de ambos lados deben coincidir. Un rango no puede ser de una fila a una columna, o de una celda a una fila.
@2..$4
- No válido, no puede ser de una fila a una columna.@2$3..@5
- Válido, si la columna existe en el primer término y no en el segundo, se traslada al segundo.@2$3..@5$5
- Válido, de una celda a otra.$4..$6
- Válido, de una columna a otra.
Los rangos se pueden utilizar para seleccionar partes de una fila o columna.
@2$>..@5$>
- La última columna, desde la fila 2 hasta la fila 5. Aridad 4x1@3$<..@3$5
- La tercera fila, desde la primera columna hasta la quinta. Aridad 1x5
Los rangos también se pueden utilizar para seleccionar más de una fila o columna.
@<..@>
- La fila completa desde la primera hasta la última (toda la tabla).@3$1..@4$3
- Desde la fila 3 hasta la fila 4, desde la columna 1 hasta la 3. Aridad 2x3
Operaciones algebraicas #
Se pueden utilizar fórmulas para sumar, restar, multiplicar y dividir valores en una tabla. Todas las operaciones algebraicas deben estar entre paréntesis.
Sumar #
Al sumar, al menos uno de los valores especificados debe ser una sola celda. Una fórmula no puede agregar un rango a otro rango.
(@2$3+@3$4)
- Válido, suma dos celdas.(@2+@3$4)
- Válido, suma el valor de la fila dos de la celda actual a la celda @3$4.(@2$3+$4)
- Válido, suma el valor de @2$3 al valor de la fila actual, columna $4.(@2+@3)
- Válido, suma el valor de la columna actual de la fila 2 a la columna actual de la fila 3.@2$3+$4
- Inválido, faltan paréntesis.
Ejemplo sumar #
En esta tabla, la columna de la derecha tenía el mismo aspecto que la de la izquierda, con sólo los dos primeros valores rellenados. La fórmula rellena la última columna desde la fila 4 hasta la última fila. Para cada fila, añade el valor de las dos filas anteriores. Puede que reconozcas esto como la Secuencia de Fibonacci
Inicio | Fibonacci |
---|---|
1 | 1 |
1 | 1 |
2 | |
3 | |
5 | |
8 | |
13 | |
21 |
<!-- TBLFM: @4$>..@>$>=(@-1+@-2) -->
Restar #
La resta requiere que el segundo operando sea una sola celda. El primer operando puede ser un rango o una celda.
(@2$3-@3$4)
- Válido, resta dos celdas.(@2-@3$4)
- Válido, resta una sola celda de cada valor de la fila.(@3$4-@2)
- Válido, el valor de la fila dos de la columna actual de @3$4.@2-@3$4
- No válido, faltan paréntesis.
Ejemplo de resta #
En este ejemplo, estamos restando el valor de la fila tres (4, 5, 6) del valor de @2$3
(3). Observa cómo cada resultado (-1, -2, -3) restó el valor de la celda correspondiente de la fila tres.
Uno | Dos | Tres |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
-1 | -2 | -3 |
<!-- TBLFM: @>=(@2$3-@3) -->
Multiplicar #
La multiplicación requiere que al menos un valor sea una sola celda. Una fórmula no puede multiplicar un rango por otro rango.
(@2$3*@3$4)
- Válido, multiplica dos celdas.(@2*@3$4)
- Válido, multiplica una sola celda con la columna actual en la fila 2.(@2$3*$4)
- Válido, multiplica una sola celda con la fila actual en la columna 4.(@2*@3)
- Válido, multiplica la columna actual en la fila 2 con la columna actual en la fila 3.(@2..@3*@2$4..@4$4)
- No válido, ambos operandos son rangos.@2$3*$4
- Inválido, faltan paréntesis.
Dividir #
La división requiere que el segundo operando sea una sola celda. El primer operando puede ser un rango o una celda.
(@2$3/@3$4)
- Válido, divide dos celdas.(@2/@3$4)
- Válido, divide cada valor de la fila por una sola celda.(@3$4/@2)
- Válido, divide una sola celda por la columna actual en la fila 2.(@3$4/@2..@3)
- Inválido, no se puede dividir una sola celda por un rango.@2/@3$4
- Inválido, faltan paréntesis.
Operaciones condicionales #
Las operaciones condicionales permiten elegir un valor en función de la comparación de dos entradas. Por ejemplo:
if(@3$4<@4$5, @2, @3)
En este ejemplo, comparamos los valores ubicados en la celda @3$4
con los de la celda @4$5
. Si el primero es menor que (<) el segundo, entonces el resultado será el primer parámetro (@2)
, de lo contrario, el resultado será el segundo parámetro (@3
).
Las comparaciones solo se pueden realizar entre celdas, no entre rangos.
Operadores de comparación #
<
- Menor que>
- Mayor que<=
- Menor o igual que>=
- Mayor o igual que==
- Igual!=
- No igual
Ejemplo condicional #
Esta operación condicional establece los valores en la última columna (excepto el encabezado). Para cada fila, verifica si la primera columna es mayor que tres. Si lo es, ese valor se coloca en la última columna; de lo contrario, el valor de tres se coloca en la última columna.
En otras palabras, esta función establece la última columna en el mayor de los valores de la primera columna y tres.
Uno | Dos | Tres |
---|---|---|
1 | 2 | 3 |
4 | 5 | 4 |
-1 | -2 | 3 |
<!-- TBLFM: $>=if($1>3, $1, 3) -->
Funciones #
Las funciones son muy similares a las operaciones condicionales. Una palabra clave seguida de un paréntesis con valores dentro. Por ejemplo, mean(@3$<..@3$4)
. Una llamada de función pasa los datos del rango, celda, fila o columna proporcionados, luego realiza un cálculo y devuelve el resultado.
Hay dos funciones que se pueden usar:
sum #
sum
es muy similar a la operación algebraica de suma anterior, pero sumará todas las celdas en el rango, fila o columna proporcionados y generará un único resultado de celda.
Uno | Dos | Tres |
---|---|---|
1 | 2 | |
4 | 5 | |
Total | 12 |
<!--TBLFM: @>$>=sum(@2$<..@3$2)-->
mean #
mean calcula el promedio del rango, la fila o la columna proporcionados. Al igual que sum, generará un resultado de una sola celda.
Anidación #
Los diferentes bloques de construcción de una función se pueden anidar, siempre que su aridad coincida. Por ejemplo, la salida de sum
se puede usar como entrada para una operación condicional. A continuación, se muestran algunos ejemplos de anidamiento válido:
<!-- TBLFM: @>=sum(@3..@4)+@3$1 -->
- Suma @3$1 a cada columna resultante de la suma<!-- TBLFM: @3$3=if(@2$4+@2$5==@2$6, @3$3, @4$3) -->
- Suma dos celdas en la comparación
Encadenamiento y fórmulas múltiples #
Una tabla puede tener varias fórmulas definidas. Esto se puede hacer de dos maneras. En una sola línea de fórmula, se pueden “encadenar” varias fórmulas, separadas por ::
. Por ejemplo:
<!-- TBLFM: @2=@4::$1=$2 -->
Cuando se encadenan, las fórmulas se evaluarán de izquierda a derecha. La tabla resultante después de aplicar la primera fórmula se utilizará como entrada para la segunda fórmula. Esto significa que la segunda fórmula puede funcionar con valores calculados a partir de la primera fórmula.
El segundo método es con varias líneas de fórmula.
<!-- TBLFM: @2=@4 -->
<!-- TBLFM: $1=$2 -->
Este método es equivalente al encadenamiento. Las líneas de fórmula se evaluarán de arriba hacia abajo. Al igual que en el encadenamiento, la tabla de salida después de una fórmula se pasa como entrada a la siguiente.
Estos métodos se pueden combinar.
<!-- TBLFM: @2=@4::$1=$2 -->
<!-- TBLFM: @5$3=sum(@2) -->
Opciones de formato #
Opcionalmente, puede solicitar que el resultado se muestre con un determinado número de decimales utilizando una directiva de formato. Por ejemplo:
A | B | C | D |
---|---|---|---|
1 | 2 | 5 | 6 |
3 | 4 | 7 | 8 |
<!-- TBLFM: @>=(@I / @3$4);%.2f -->
En este ejemplo, la directiva de formato es ;%.2f
al final. Sin eso, los resultados serían valores como 0,14285714285714285
, pero como hemos solicitado 2 puntos decimales, los resultados serán 0,14
.
También puede generar el resultado como una fecha y hora con la directiva de formato ;dt
o como horas y minutos con la directiva de formato ;hm
. En este ejemplo, tomamos una fecha y hora y le sumamos 600000 milisegundos, luego generamos el resultado como una fecha y hora.
Inicio | Ms | Fin |
---|---|---|
2023-07-12 10:00 | 600000 | 2023-07-12 10:10 |
<!-- TBLFM: $>=($1 + $2);dt -->
Horas y duraciones #
Existe un soporte muy básico para operar con horas en tablas.
Las horas se representan como una cadena de fecha y hora (2022-12-31 23:59) o como milisegundos desde la época (1672559940000). Las duraciones se pueden expresar como horas y minutos (23:59) o en milisegundos.
Por ejemplo, podemos restar una hora de finalización de una hora de inicio y ver la duración en milisegundos o como horas y minutos:
Inicio | Fin | Ms | Mins | Duración |
---|---|---|---|---|
2023-07-12 10:00 | 2023-07-12 12:10 | 7800000 | 130 | 02:10 |
<!-- TBLFM: $3=($2 - $1) -->
<!-- TBLFM: $4=(($2 - $1) / 60000) -->
<!-- TBLFM: $5=($2 - $1);hm -->
Las duraciones formateadas como horas y minutos también se pueden usar para representar una hora del día.
El siguiente ejemplo muestra una tabla que alguien podría usar para hacer un seguimiento del tiempo que dedica a las tareas. Completa el nombre de cada tarea junto con las horas de inicio y finalización de la tarea, omitiendo opcionalmente una hora de inicio si es la misma que la hora de finalización de las tareas anteriores. Las fórmulas calculan la duración de cada tarea, junto con el tiempo total dedicado a todas las tareas.
Tarea | Inicio | Fin | Duración |
---|---|---|---|
Día del plan | 09:00 | 09:15 | 00:15 |
Corregir error n.° 1 | 09:27 | 11:33 | 02:06 |
Corregir error n.° 2 | 12:22 | 00:49 | |
Clasificar errores | 13:00 | 17:00 | 04:00 |
Limpiar escritorio | 17:30 | 00:30 | |
Total | 07:40 |
<!-- TBLFM: $>=($3 - if($2>0, $2, @-1$3));hm -->
<!-- TBLFM: @>$>=sum(@I..@-1);hm -->
Conclusión #
Esta documentación es un trabajo en curso. Por favor, ayude a mejorarla enviando sus preguntas o sugerencias a https://github.com/tgrosinger/md-advanced-tables/issues.
Espero que te haya gustado, pasa un gran día 🐧