Fiche data manager - ACP (Compte-rendu d'Anatomie et Cytologie Pathologiques)
Nom technique : acp
📥 Télécharger un modèle de CSV
Vocation
Section intitulée « Vocation »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.
Format canonique d’import
Section intitulée « Format canonique d’import »Séparateur de colonnes : ; (point-virgule). Le , est également accepté (auto-détection) ; entourez de guillemets "…" toute cellule contenant le séparateur, un retour ligne ou un ; interne (cf. ligne FOURNIER/ROBERT du CSV d’exemple où la conclusion contient un ;).
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 + morpho séparés par une espace).
Toutes les colonnes ci-dessous sont des champs fournis par le data manager (sauf les 3 contrôles d’import en fin de tableau), dans l’ordre du manifeste.
Colonne (csvKey) | Libellé | Format attendu | Obligatoire | Nature |
|---|---|---|---|---|
patient_last_name | Nom | texte | oui | Identité patient |
patient_first_name | Prénom | texte | - | Identité patient |
patient_birth_name | Nom naissance | texte | - | Identité patient |
patient_birth_date | Date naissance | date (JJ/MM/AAAA ou AAAA-MM-JJ) | - | Identité patient |
patient_sex | Sexe | texte (M/F) | - | Identité patient |
patient_nip | NIP | texte | - | Identifiant patient source |
patient_secu | N° Secu (NIR) | NIR (seuls les 10 premiers chiffres conservés) | - | Identité patient |
patient_address | Adresse | texte | - | Adresse patient |
patient_postal_code | Code postal | code postal (zéros de tête restaurés) | - | Adresse patient |
patient_city | Ville | texte | - | Adresse patient |
patient_birth_commune | Commune de naissance | texte | - | Lieu de naissance |
patient_birth_postal_code | Code postal de naissance | code postal (zéros de tête restaurés) | - | Lieu de naissance |
patient_birth_insee_code | Code INSEE de naissance | texte | - | Lieu de naissance |
nda | NDA | texte | - | Prélèvement |
sampling_date | Date prélèvement | date (JJ/MM/AAAA ou AAAA-MM-JJ) | - | Prélèvement |
registration_date | Date enregistrement | date (JJ/MM/AAAA ou AAAA-MM-JJ) | - | Prélèvement |
validation_date | Date validation | date (JJ/MM/AAAA ou AAAA-MM-JJ) | - | Prélèvement |
source_exam_id | N° CR ANAPAT | texte | oui | Identifiant CR (clé dédup) |
service_name | Service | texte | - | Source |
prescriber_name | Prescripteur | texte | - | Prescripteur |
prescriber_address | Adresse prescripteur | texte | - | Prescripteur |
prescriber_postal_code | CP prescripteur | code postal (zéros de tête restaurés) | - | Prescripteur |
prescriber_city | Ville prescripteur | texte | - | Prescripteur |
prescriber_rpps | RPPS prescripteur | code (majuscules, points/espaces retirés) | - | Prescripteur |
adicap_codes | Codes ADICAP | valeur packée - codes ADICAP séparés par | | - | Codification (table fille) |
snomed_codes | Codes SNOMED | valeur packée - couples T-xxxxx M-yyyyy séparés par | | - | Codification (table fille) |
sampling_topography_text | Topographie (texte) | texte libre | - | Anapath |
sampling_morphology_text | Morphologie (texte) | texte libre | - | Anapath |
laterality | Latéralité | texte : G gauche, D droite, B bilatéral, M médian | - | Anapath |
cr_conclusion | Conclusion | texte libre | - | Compte-rendu |
cr_description | Description | texte libre | - | Compte-rendu |
cr_raw_content | Texte complet CR | valeur brute (texte) | - | Compte-rendu |
can_create_patient | Peut créer un patient | oui/non | - | Contrôle import |
can_create_tumor | Peut créer une tumeur | oui/non | - | Contrôle import |
excluded | Exclu | entier (0/vide, 1, ≥2) | - | Contrôle import |
Télécharger un modèle de CSV au format attendu
Préparer son CSV à partir de la source brute
Section intitulée « Préparer son CSV à partir de la source brute »Travail concret pour passer de l’export labo (CSV plat, XML CRAP/DIAMIC, PDF, XLS) au CSV canonique :
-
Identifier l’identifiant de ligne.
source_exam_id(N° CR ANAPAT) est obligatoire avecpatient_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). -
Mapper les colonnes locales vers les
csvKeydu tableau Format canonique d’import. L’auto-mapping reconnaît aussi quelques alias de libellé (NIRpourpatient_secu,Commune naissance,CP naissance,Code INSEE naissance). Un seul identifiant patient est attendu :patient_nip(libellé « NIP »). -
Normaliser les dates au format
JJ/MM/AAAA(l’anapath utilise surtout les slashs ;AAAA-MM-JJest aussi accepté). Toute autre forme (texte,JJ-MM-AAAA, heure accolée…) rejette la ligne si c’est un champ obligatoire, et est silencieusement vidée sinon. -
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.
-
Packer les codes de codification dans une seule cellule, séparés par
|:- ADICAP :
adicap_codes=BHGS0F2A|PHAS0AA1. - 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).
- ADICAP :
-
Normaliser l’ADICAP sur 8 caractères. Cas de longueur source : 2 = organe seul, 6 = organe + lésion, 8 = complet.
- Si la partie organisation D1/D2 manque (code à 6 caractères), padder en préfixe par
XX→XX+ 6 = 8. - Si la source fournit 10 caractères, tronquer à 8 (le surplus n’est pas exploité).
- Si la partie organisation D1/D2 manque (code à 6 caractères), padder en préfixe par
-
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. -
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.
-
Latéralité : une seule valeur par ligne (
Ggauche,Ddroite,Bbilatéral,Mmédian), appliquée à tous les codes de la ligne. -
Texte du CR : alimenter
cr_conclusion,cr_descriptionetcr_raw_contentselon ce que la source distingue. Si la source ne sépare pas, mettre le texte complet danscr_raw_content. Échapper avec des guillemets toute cellule contenant;ou un retour ligne. -
Ne PAS dédupliquer côté data manager : voir Spécificités. Laisser les codes identiques, le SI les collapse.
Comportement par défaut à l’import
Section intitulée « Comportement par défaut à l’import »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/non (aussi acceptés : 1/0, o/n, true/false, vrai/faux, x). 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 :
0ou vide = ligne non exclue ;1(ou une valeur vraie sans numéro :oui/x/true) = 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.
Ce que fait le système à l’import
Section intitulée « Ce que fait le système à l’import »Une fois votre fichier déposé, le système traite chaque ligne en trois temps :
- Validation - il contrôle les champs obligatoires et les formats (dates, couples SNOMED…). Une ligne invalide est rejetée, avec son motif affiché dans l’aperçu avant import.
- Transcodage et mise en qualité - il éclate les codes ADICAP/SNOMED, les traduit en CIM-O-3 (topographie + morphologie) et calcule les groupes (Berg, IARC).
- Enregistrement - les lignes valides deviennent des signalements, avec leurs tables filles de codes.
Le rapprochement avec un patient (réconciliation) se fait ensuite, dans une étape séparée : rien à préparer pour ça dans le CSV.
Spécificités
Section intitulée « Spécificités »- Tables filles : les codes packés alimentent deux tables 1:N -
report_acp_adicap_codes(un code = une ligne) etreport_acp_snomed_codes(un couple T/M = une ligne). Le SI éclate lui-même la cellule packée. - Déduplication : clé = structure source +
source_exam_id. La structure n’étant pas dans le CSV (choisie à l’interface), c’est bien le couple qui forme lededup_hash. 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.
Points d’attention
Section intitulée « Points d’attention »- Rejet de ligne :
patient_last_nameousource_exam_idabsent/vide → ligne rejetée. Date obligatoire malformée → rejet (ici aucune date n’est obligatoire, mais une date mal formée part vide). Couple SNOMED malformé (TouMmanquant, format hors[TM]-xxxxx) → rejet de la ligne. Numéro d’exclusion inconnu du catalogue → rejet. - Séparateur packé :
;dansadicap_codes/snomed_codescasse le parsing (interprété comme fin de colonne). Toujours|. - ADICAP non normalisé : code à 6 caractères non préfixé par
XX, ou code à 10 non tronqué → éclatement D1/D2/D3 faussé, donc transcodage CIM-O-3 erroné. - Codes hémato
H…: reconnus mais droppés du transcodage (pas de morpho CIM-O-3, pas de groupe Berg) → ces lignes n’auront pas de classification 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_idchange 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_idou clés distinctes).