Aller au contenu

Fiche pratique - ACP

Nom technique : acp

📥 Télécharger un modèle de CSV

Le signalement ACP correspond au compte-rendu d’anatomie et cytologie pathologiques produit par un laboratoire d’anapath à partir d’un prélèvement (biopsie, pièce opératoire, cytologie). C’est la source la plus riche du registre - elle porte à la fois une codification structurée (codes ADICAP ou SNOMED) et le texte du CR (conclusion, description, texte complet) - et une source à fort volume. Elle provient des laboratoires publics et privés du territoire, dans des formats très hétérogènes (CSV plat, XML CRAP/DIAMIC, PDF, XLS) qu’il faut remapper vers le CSV canonique. On en attend l’identification des cancers incidents et leur caractérisation morphologique/topographique.

Une ligne = un compte-rendu anatomo-pathologique.

Séparateur de colonnes ; recommandé (, également auto-détecté) ; entourez de guillemets "…" toute cellule contenant le séparateur ou un retour ligne. En-têtes en snake_case, identiques aux csvKey du tableau ci-dessous et dans l’ordre du manifeste. Toutes les colonnes sont des champs fournis par le data manager, sauf les trois contrôles d’import (can_create_patient, can_create_tumor, excluded) en fin de tableau.

Colonnes packées (adicap_codes, snomed_codes) : plusieurs valeurs dans une seule cellule, séparées par | (jamais ;). Pour SNOMED, chaque entrée est un couple atomique « T-xxxxx M-yyyyy » (topo puis morpho, séparés par une espace).

Colonne (csvKey)LibelléFormat attenduObligatoireNature
patient_last_nameNomtexteouiIdentité patient
patient_first_namePrénomtexte-Identité patient
patient_birth_nameNom naissancetexte-Identité patient
patient_birth_dateDate naissancedate (JJ/MM/AAAA ou AAAA-MM-JJ), pas dans le futur-Identité patient
patient_sexSexetexte (M/F)-Identité patient
patient_nipNIPtexte-Identifiant patient source
patient_secuN° Secu (NIR)NIR (seuls les 10 premiers chiffres conservés)-Identité patient
patient_addressAdressetexte-Adresse patient
patient_postal_codeCode postalcode postal (zéros de tête restaurés)-Adresse patient
patient_cityVilletexte-Adresse patient
patient_birth_communeCommune de naissancetexte-Lieu de naissance
patient_birth_postal_codeCode postal de naissancecode postal (zéros de tête restaurés)-Lieu de naissance
patient_birth_insee_codeCode INSEE de naissancetexte-Lieu de naissance
structure_finessFINESS de l’établissementcode FINESS (9 caractères) connu du registre ; vide accepté, inconnu ou malformé → ligne rejetée-Structure
ndaNDAtexte-Prélèvement
sampling_dateDate prélèvementdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
registration_dateDate enregistrementdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
validation_dateDate validationdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
source_exam_idN° CR ANAPATtexteouiIdentifiant CR (clé dédup)
service_nameServicetexte-Source
pathologist_namePathologiste signatairetexte (nom du médecin qui a signé le CR)-Prélèvement
prescriber_namePrescripteurtexte-Prescripteur
prescriber_addressAdresse prescripteurtexte-Prescripteur
prescriber_postal_codeCP prescripteurcode postal (zéros de tête restaurés)-Prescripteur
prescriber_cityVille prescripteurtexte-Prescripteur
prescriber_rppsRPPS prescripteurcode (majuscules, points/espaces retirés)-Prescripteur
adicap_codesCodes ADICAPvaleur packée - codes ADICAP séparés par |-Codification (table fille)
snomed_codesCodes SNOMEDvaleur packée - couples T-xxxxx M-yyyyy séparés par |-Codification (table fille)
sampling_topography_textTopographie (texte)texte libre-Anapath
sampling_morphology_textMorphologie (texte)texte libre-Anapath
lateralityLatéralitéG gauche, D droite, B bilatéral, M médian-Anapath
cr_conclusionConclusiontexte libre-Compte-rendu
cr_descriptionDescriptiontexte libre-Compte-rendu
cr_raw_contentTexte complet CRvaleur brute (texte)-Compte-rendu
documentDocument associénom de fichier (extension comprise) d’une entrée de l’archive ZIP déposée avec le CSV ; vide accepté, nom absent → ligne sans document (voir Documents associés)-Document
can_create_patientPeut créer un patientoui/non-Contrôle import
can_create_tumorPeut créer une tumeuroui/non-Contrôle import
excludedExcluentier (0/vide, 1, ≥2)-Contrôle import

Télécharger un modèle de CSV au format attendu

Travail concret pour passer de l’export labo (CSV plat, XML CRAP/DIAMIC, PDF, XLS) au CSV canonique :

  1. Identifier l’identifiant de ligne. source_exam_id (N° CR ANAPAT) est obligatoire avec patient_last_name. Si la source n’expose pas de numéro d’examen exploitable, construire une clé stable par concaténation : nom + prénom + sexe + date de naissance + date anapath + code. Cette clé doit être reproductible d’un export à l’autre (sinon le réimport recrée des doublons).

  2. Renommer les colonnes locales en csvKey du tableau Format canonique d’import. Les en-têtes sont comparés à la lettre (espaces et casse ignorés) : un libellé (« Nom ») ou un ancien alias (« NIR ») n’est pas reconnu, et une colonne obligatoire absente sous son nom exact bloque le fichier au dépôt. Les colonnes inconnues sont conservées mais ignorées. Un seul identifiant patient est attendu : patient_nip (libellé « NIP »).

  3. Normaliser les dates au format JJ/MM/AAAA (l’anapath utilise surtout les slashs ; AAAA-MM-JJ est aussi accepté). Toute autre forme (texte, JJ-MM-AAAA, heure accolée, date hors calendrier comme 31/02/2025…) met la ligne en erreur à la pré-validation, que la date soit obligatoire ou non : la ligne n’est pas intégrée tant que le fichier n’est pas corrigé.

  4. Préparer le NIR. Le système ne conserve que les 10 premiers chiffres (garde-fou : espaces et caractères non numériques retirés, troncature à 10 chiffres). Inutile de le tronquer à la main.

  5. Packer les codes de codification dans une seule cellule, séparés par | :

    • ADICAP : adicap_codes = PHGSA5B2|PHGSA7B2.
    • SNOMED : snomed_codes = T-04000 M-81403|T-08000 M-80703 (un couple = topo + morpho, séparés par une espace).
    • Un CR n’a généralement qu’une seule des deux colonnes renseignée (ADICAP ou SNOMED selon le labo).
  6. Vérifier la longueur des codes ADICAP. Un code complet fait 8 caractères : mode de prélèvement (D1), technique (D2), organe (D3, 2 caractères) puis lésion (4 caractères). Selon la longueur fournie :

    • 8 caractères (complet) : à pousser tel quel.
    • 6 caractères (organe + lésion) : à pousser tel quel, le SI préfixe lui-même le code par XX.
    • 2 caractères (organe seul) : préfixer par XX (GS → XXGS). Sans ce préfixe, la ligne est en erreur à la pré-validation ; avec, seule la topographie est transcodée.
    • 10 caractères : tronquer à 8. Sinon la lésion est lue sur 6 caractères, n’est pas trouvée, et le code reste sans morphologie.
    • Hors de 4 à 12 caractères, la ligne est en erreur à la pré-validation. Entre les deux, les autres longueurs sont acceptées mais le découpage est faux et le transcodage ne trouve rien.
  7. Codes hémato (lésion commençant par H, ex. H580) : les pousser tels quels. Ils sont acceptés mais pas transcodés en CIM-O-3, faute des tables de transcodage adéquates. Ne pas les convertir à la main.

  8. Filtrer les codes non-cancer EN AMONT. Le SI ne le fait pas. Retirer du fichier les codes ADICAP/SNOMED bénins hors champ du registre.

  9. Latéralité : une seule valeur par ligne (G gauche, D droite, B bilatéral, M médian), appliquée à tous les codes ADICAP et SNOMED de la ligne. Convertir les libellés source (« Gauche », « droit »…) en ces lettres : la valeur n’est pas contrôlée à la pré-validation, et une valeur de plus de 2 caractères fait échouer la ligne à l’intégration. Une ligne sans aucun code ADICAP ni SNOMED ne conserve pas sa latéralité.

  10. Texte du CR : alimenter cr_conclusion, cr_description et cr_raw_content selon ce que la source distingue. Si la source ne sépare pas, mettre le texte complet dans cr_raw_content. Échapper avec des guillemets toute cellule contenant ; ou un retour ligne.

  11. Ne PAS dédupliquer côté data manager : voir Spécificités. Laisser les codes identiques, le SI les collapse.

Par défaut pour la typologie ACP : can_create_patient = oui et can_create_tumor = oui. La typologie n’est donc pas en « rattachement seul » : un CR anapath porte un diagnostic histologique fiable, il peut donc à la fois créer un patient inconnu et ouvrir une nouvelle tumeur.

Surcharge par ligne : renseigner les colonnes can_create_patient / can_create_tumor avec oui ou non uniquement : toute autre valeur met la ligne en erreur à la pré-validation. Mettre non pour forcer un simple rattachement sur une ligne donnée (ex. ligne dont on ne veut pas qu’elle crée une tumeur isolée).

Colonne excluded :

  • 0 ou vide = ligne non exclue ;
  • 1 = exclusion avec le motif par défaut (motif global n°1) ;
  • ≥ 2 = motif spécifique du catalogue d’exclusion du registre. Un numéro inconnu du catalogue fait rejeter la ligne.
  • Seuls des chiffres sont acceptés : oui, x, -1, 1.5 ou tout texte mettent la ligne en erreur à la pré-validation.

Une fois votre fichier déposé, le système traite chaque ligne en trois temps :

  1. Pré-validation - dès le dépôt, il contrôle les champs obligatoires, la lisibilité de chaque valeur (dates, sexe, oui/non…), le FINESS et le numéro d’exclusion. Une ligne en anomalie passe en erreur et n’est pas intégrée ; ses anomalies s’affichent dans le tableau de pré-validation et dans le fichier annoté. Dans adicap_codes et snomed_codes, chaque code séparé par | est contrôlé : un code ADICAP de 4 à 12 caractères (lettres, chiffres, point), un couple SNOMED T-xxxxx M-yyyyy dans cet ordre. Un autre séparateur (,, espace) met la ligne en erreur. Le code n’est pas confronté au référentiel ADICAP à ce stade.
  2. Transcodage et mise en qualité - il éclate les codes ADICAP/SNOMED, les traduit en CIM-O-3 (topographie + morphologie) et en déduit les groupes IARC topographique et morphologique.
  3. Enregistrement - les lignes valides deviennent des signalements, avec leurs tables filles de codes.

Le rapprochement avec un patient (identito-vigilance) se fait ensuite, dans une étape séparée, sur l’identité créée à l’import : rien à préparer pour ça dans le CSV.

  • Tables filles : les codes packés alimentent deux tables 1:N - report_acp_adicap_codes (un code = une ligne) et report_acp_snomed_codes (un couple T/M = une ligne). Le SI éclate lui-même la cellule packée.
  • Déduplication : clé = structure_finess + source_exam_id. Au sein d’un même CR, le SI collapse automatiquement les codes ADICAP/SNOMED strictement identiques → ne pas dédupliquer côté data manager.
  • Réimport (export typiquement sur 2 mois glissants) : un même N° de CR → même hash → la ligne en doublon est ignorée (skip), pas réinsérée. La mise à jour d’un CR amendé (relu/complété) n’est pas encore implémentée - stratégie à définir.
  • Transcodage : ADICAP D3 → CIM-O-3 topo, D45678 → CIM-O-3 morpho ; SNOMED via les tables ref_snomed_to_cimo3_*. Codes hémato GFHC reconnus mais non transcodés.
  • Ligne en erreur à la pré-validation : patient_last_name ou source_exam_id absent ou vide ; valeur illisible dans n’importe quelle colonne, obligatoire ou non (date hors JJ/MM/AAAA, sexe hors M/F, can_create_* hors oui/non, laterality hors G/D/B/M, code ADICAP ou couple SNOMED mal formé…) ; date de naissance postérieure au jour du dépôt ; FINESS mal formé ou inconnu ; excluded autre qu’un nombre, ou numéro d’exclusion inconnu du catalogue. La ligne n’est pas intégrée : corriger le fichier et le redéposer.
  • Séparateur packé : ; dans adicap_codes/snomed_codes casse le parsing (interprété comme fin de colonne). Toujours |.
  • ADICAP non normalisé : code de 10 caractères non tronqué → lésion introuvable, pas de morphologie CIM-O-3. Code de moins de 4 caractères (organe seul non préfixé par XX) → ligne en erreur à la pré-validation.
  • Codes ADICAP/SNOMED hors référentiel : aucun contrôle de référentiel, ni à la pré-validation ni à l’intégration. Un code inconnu des tables de transcodage est enregistré sans que rien ne le signale.
  • Codes hémato H… : reconnus mais droppés du transcodage (pas de morpho CIM-O-3) → ces lignes n’auront pas de morphologie tant que la correspondance n’est pas livrée.
  • Codes non-cancer non filtrés : le SI ne les écarte pas → ils créent du bruit (voire des tumeurs parasites). Filtrage obligatoire en amont, en conservant dysplasies/borderline.
  • Topo CIM-O-3 inconnue : fallback C80 (site primitif inconnu) - vérifier que la topographie est bien codée si on veut éviter ce fallback.
  • Clé instable : si source_exam_id change entre deux exports pour le même CR (ex. clé reconstruite non reproductible), le réimport crée un doublon au lieu d’être ignoré.
  • Latéralité unique : une seule latéralité par ligne s’applique à tous les codes - si une ligne mêle deux organes de côtés différents, scinder en deux lignes (deux source_exam_id ou clés distinctes).