# Recette CSV et Parquet avec DuckDB 1.5.6

Données entièrement fictives, atelier local Nymphar du 12 octobre 2026.

Télécharger `factures.csv`, `recette.py` et `requirements.txt` dans le même dossier.
Python 3.10 ou plus récent. Exécuté avec Python 3.14.7 sur macOS arm64 et DuckDB 1.5.6.

```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python recette.py > resultat.json
```

Sous Windows, utiliser `.venv\Scripts\python.exe` à la place de `.venv/bin/python`.

Le script lit le CSV avec des types explicites, crée des fichiers Parquet partitionnés
dans un répertoire temporaire unique, puis les relit. Les fichiers temporaires sont
supprimés à la sortie ; le CSV d'origine n'est jamais modifié. Aucun compte cloud,
appel de modèle, accès distant ou téléchargement d'extension dans le script.

Le jeu nominal comporte 10 identifiants distincts, une valeur absente, une valeur
nulle au sens numérique (0,00) et une somme des montants connus de 500,00 EUR.
Cette somme ne constitue pas un total facturé complet : un montant est inconnu.

Les quatre anomalies injectées doivent être détectées : doublon, montant exprimé
en centimes à la place d'euros, partition omise de la liste de lecture, texte dans
une colonne décimale. `success: true` signifie que les cinq scénarios ont le
comportement attendu, pas que toutes les variantes sont acceptées.

Le script est une recette pédagogique avec une référence métier fixée pour ce
seul CSV. Pour vos données, définir une référence indépendante, les clés, unités,
tolérances, valeurs manquantes admises et partitions attendues. Brancher ensuite
un échec de contrôle sur votre chaîne de diffusion. Ne pas remplacer le fichier
CSV par un export métier sans adapter ces attentes.

La requête MAX sur une partition filtrée couvre un cas lié à la correction
DuckDB #25766 ; elle n'est pas une reproduction exacte de ce ticket ni une
comparaison avec 1.5.5. Aucun benchmark de performances n'est fourni.

Guide : https://nymphar.ai/blog/duckdb-156-recette-csv-parquet
