Composant intermediaire de normalisation et nettoyage des donnees. Se place entre <dsfr-data-source> et <dsfr-data-query> pour nettoyer les donnees avant traitement.

Invisible : Ce composant ne rend rien visuellement. Il normalise les donnees et les redistribue aux composants en aval via le systeme d'evenements.

Position dans le pipeline

dsfr-data-sourcedsfr-data-normalizedsfr-data-querydsfr-data-chart

Normaliser avant dsfr-data-query permet aux filtres et agregations de travailler sur des donnees propres (evite les comparaisons string vs number).

Cas d'usage

Attributs

AttributTypeDefautDescription
idString-Requis. Identifiant de la sortie.
sourceString""Requis. ID de la source a ecouter.
numericString""Champs a forcer en nombre (virgule-separes).
numeric-autoBooleanfalseDetection et conversion automatique des champs numeriques.
renameString""Renommage de cles : "ancien:nouveau | ancien2:nouveau2"
trimBooleanfalseSupprime les espaces en debut/fin des valeurs string.
strip-htmlBooleanfalseSupprime les balises HTML des valeurs string.
replaceString""Remplacement global de valeurs : "N/A: | n.d.: | -:0"
replace-fieldsString""Remplacement cible par champ : "CHAMP:ancien:nouveau | CHAMP2:a:n". Ne remplace que dans le champ specifie. Combinable avec replace.
flattenString""Cle du sous-objet a aplatir au premier niveau. Supporte la dot notation ("data.attributes").
roundString""Arrondit les champs numeriques. Format : "champ1, champ2" (0 decimales) ou "champ1:2, champ2:0" (N decimales).
lowercase-keysBooleanfalseMet toutes les cles en minuscules.

Separateurs : rename et replace utilisent le pipe | pour separer les paires, et : pour separer la cle de la valeur. replace-fields utilise le format CHAMP:pattern:remplacement (les 2 premiers : sont des delimiteurs). numeric utilise la virgule.

Exemple : trim + renommage

Les donnees brutes RappelConso contiennent des noms de colonnes longs et techniques. On renomme les colonnes pour la lisibilite et on nettoie les espaces superflus.

Donnees brutes (JSON)

{
  "modeles_ou_references": " Lot 2024-ABC ",
  "categorie_produit": "Alimentation",
  "marque_produit": "Ma Marque",
  "date_publication": "2024-06-15",
  "motif_rappel": "Presence de Listeria"
}

Apres normalisation

{
  "Produit": "Lot 2024-ABC",       // trim + rename
  "Categorie": "Alimentation",     // rename
  "Marque": "Ma Marque",           // rename
  "Date": "2024-06-15",            // rename
  "Motif": "Presence de Listeria"  // rename
}

Code

<dsfr-data-source id="raw" api-type="opendatasoft"
  dataset-id="rappelconso-v2-gtin-trie"
  base-url="https://data.economie.gouv.fr"
  server-side page-size="50">
</dsfr-data-source>

<dsfr-data-normalize id="clean" source="raw"
  trim
  rename="modeles_ou_references:Produit | categorie_produit:Categorie | marque_produit:Marque | date_publication:Date | motif_rappel:Motif">
</dsfr-data-normalize>

<!-- Les donnees normalisees sont pretes pour query/chart -->
<dsfr-data-list source="clean" pagination="5"></dsfr-data-list>

Exemple : pipeline complet

Source → Normalize → Query → Chart

<dsfr-data-source id="raw" url="..." transform="results"></dsfr-data-source>

<dsfr-data-normalize id="clean" source="raw"
  numeric="population, budget"
  rename="pop_tot:Population totale | lib_dep:Departement"
  trim
  replace="N/A: | n.d.:">
</dsfr-data-normalize>

<dsfr-data-query id="stats" source="clean"
  group-by="Departement"
  aggregate="population:sum"
  order-by="population__sum:desc"
  limit="10">
</dsfr-data-query>

<dsfr-data-chart source="stats" type="bar"
  label-field="Departement"
  value-field="population__sum">
</dsfr-data-chart>

Exemple : remplacement cible par champ (INSEE)

L'API INSEE Melodi retourne des codes de dimension (AGE: "Y30T39", PCS: "3"). replace-fields permet de les decoder sans affecter les autres champs qui pourraient contenir les memes valeurs.

<dsfr-data-source id="raw" api-type="insee"
  base-url="https://api.insee.fr/melodi"
  dataset-id="DS_POPULATIONS_REFERENCE"
  where="POPREF_MEASURE:eq:PMUN, TIME_PERIOD:eq:2023">
</dsfr-data-source>

<dsfr-data-normalize id="decoded" source="raw"
  replace-fields="AGE:Y30T39:30-39 ans | AGE:Y_LT30:Moins de 30 ans | PCS:3:Cadres | PCS:5:Employes"
  replace="N/A:">
</dsfr-data-normalize>

<dsfr-data-chart source="decoded" type="bar"
  label-field="AGE" value-field="OBS_VALUE">
</dsfr-data-chart>