Generador de Informes CSV
Usa esta skill cuando un trabajo produzca una lista de filas de resultados y quieras un CSV ordenado para hojas de cálculo, además de una tabla Markdown para un comentario en PR o un resumen de Telegram, todo a partir de una única definición de columna, para que las dos salidas nunca se desvíen. Declaras las columnas (clave, encabezado, formateador opcional) una vez; el ayudante genera ambos formatos, en un orden estable de columnas, con el escapado correcto de CSV y de pipes para Markdown. Sin pandas.
Cuándo invocar
- El usuario dice: "escribe los resultados en un CSV", "exporta un informe", "haz una tabla markdown de esto", "guarda la salida de la ejecución como hoja de cálculo".
- El código en la conversación tiene un
list[dict](o lista de objetos) que actualmente se imprime de forma ad hoc.
Cuándo NO invocar
- Los datos necesitan trabajo real de dataframes - joins, group-bys, pivotes; opta por pandas/polars.
- Un único resultado escalar, donde un CSV/tabla es excesivo.
Ejemplo concreto
Entrada del usuario:
Tengo una lista de tokens escaneados con una puntuación y un precio. Guarda un CSV y también dame una tabla markdown para el resumen de Telegram.
Salida:
# Copia assets/report.py en tu proyecto, luego:
from report import Column, write_csv, to_markdown
columns = [
Column("symbol", "Símbolo"),
Column("score", "Puntuación", fmt=lambda v: f"{v:.1f}"),
Column("price_usd", "Precio", fmt=lambda v: f"${v:,.4f}"),
]
rows = [
{"symbol": "ABC", "score": 8.4, "price_usd": 0.0123},
{"symbol": "XYZ", "score": 6.1, "price_usd": 1.5},
]
write_csv("scan.csv", columns, rows) # CSV con esquema, orden estable de columnas
print(to_markdown(columns, rows)) # mismas columnas, tabla Markdown
Ambas salidas usan exactamente las mismas columnas en el mismo orden, por lo que el CSV y la tabla de resumen siempre coinciden.
Patrón a aplicar
- Declara cada
Column(key, header, fmt=...)una vez; ambos escritores consumen la misma lista, por lo que los encabezados y el orden se mantienen sincronizados. - Mantén el orden de las columnas estable y explícito; no confíes en el orden de inserción del diccionario de filas arbitrarias.
- Deja que el
fmtinvocable maneje la presentación (moneda, redondeo); almacena los valores sin procesar en los diccionarios de filas. - Usa
csv.writerpara un escapado correcto; escapa|y saltos de línea en la tabla Markdown para que nunca rompa el diseño. - Trata una clave faltante como una celda vacía en lugar de fallar, para que las filas parciales aún se reporten.
Referencia: assets/report.py.
Fuente
Destilado de uso en producción en los proyectos de automatización del autor. v1.0.0. Ver también: [[pr-body-formatter]], [[sqlite-state]], [[telegram-alerter]].
→ Construye el bot completo ejecutable con Trawlkit.