Générateur de rapports CSV
Utilisez cette compétence lorsqu'un travail produit une liste de lignes de résultats et que vous souhaitez un CSV propre pour les tableurs ainsi qu'un tableau Markdown pour un commentaire de PR ou un digest Telegram – à partir d'une seule définition de colonnes, afin que les deux sorties ne divergent jamais. Vous déclarez les colonnes (clé, en-tête, formateur optionnel) une fois ; l'assistant émet les deux formats, dans un ordre stable des colonnes, avec un bon échappement CSV et des pipes échappés pour Markdown. Pas de pandas.
Quand invoquer
- L'utilisateur dit : "écris les résultats dans un CSV", "exporte un rapport", "fais un tableau Markdown de ça", "sauvegarde la sortie du run sous forme de tableur".
- Le code dans la conversation contient une
list[dict](ou une liste d'objets) qu'il affiche actuellement de manière ad hoc.
Quand NE PAS invoquer
- Les données nécessitent un vrai travail de dataframe – jointures, group-by, pivots ; utilisez pandas/polars à la place.
- Un résultat scalaire unique, où un CSV/tableau est excessif.
Exemple concret
Entrée utilisateur :
J'ai une liste de tokens scannés avec un score et un prix. Enregistre un CSV et donne-moi aussi un tableau Markdown pour le digest Telegram.
Sortie :
# Copiez assets/report.py dans votre projet, puis :
from report import Column, write_csv, to_markdown
columns = [
Column("symbol", "Symbole"),
Column("score", "Score", fmt=lambda v: f"{v:.1f}"),
Column("price_usd", "Prix", 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 structuré, ordre stable des colonnes
print(to_markdown(columns, rows)) # mêmes colonnes, tableau Markdown
Les deux sorties utilisent exactement les mêmes colonnes dans le même ordre, donc le CSV et le tableau du digest concordent toujours.
Motif à appliquer
- Déclarez chaque
Column(key, header, fmt=...)une fois ; les deux rédacteurs consomment la même liste, donc les en-têtes et l'ordre restent synchronisés. - Gardez l'ordre des colonnes stable et explicite – ne vous fiez pas à l'ordre d'insertion du dictionnaire de lignes arbitraires.
- Laissez le callable
fmtgérer la présentation (devise, arrondi) ; stockez les valeurs brutes dans les dictionnaires de lignes. - Utilisez
csv.writerpour un marquage correct ; échappez les|et les nouvelles lignes dans le tableau Markdown pour qu'il ne casse jamais la mise en page. - Traitez une clé manquante comme une cellule vide plutôt que de planter, afin que les lignes partielles soient tout de même rapportées.
Référence : assets/report.py.
Source
Issu de l'utilisation en production dans les projets d'automatisation de l'auteur. v1.0.0. Voir aussi : [[pr-body-formatter]], [[sqlite-state]], [[telegram-alerter]].
→ Construisez le bot complet avec Trawlkit.