{"id":9864,"date":"2026-10-14T18:02:34","date_gmt":"2026-10-14T18:02:34","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-remplacer-caracteres-chaine-sas-exemples\/"},"modified":"2026-10-14T18:02:34","modified_gmt":"2026-10-14T18:02:34","slug":"comment-remplacer-caracteres-chaine-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-remplacer-caracteres-chaine-sas-exemples","title":{"rendered":"Comment remplacer des caract\u00e8res dans une cha\u00eene dans SAS (avec exemples)"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie des donn\u00e9es et de la biostatistique, la manipulation des cha\u00eenes de caract\u00e8res repr\u00e9sente une composante fondamentale du pr\u00e9traitement analytique. L&rsquo;\u00e9cosyst\u00e8me logiciel d\u00e9velopp\u00e9 par le <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS Institute<\/a> s&rsquo;est impos\u00e9 depuis plusieurs d\u00e9cennies comme un standard industriel au sein des environnements hautement r\u00e9gul\u00e9s, tels que la recherche clinique, le secteur bancaire et l&rsquo;\u00e9pid\u00e9miologie. Au sein de cet environnement, les donn\u00e9es textuelles non structur\u00e9es ou semi-structur\u00e9es requi\u00e8rent des proc\u00e9dures d&rsquo;assainissement rigoureuses pour garantir que les variables cat\u00e9gorielles, les identifiants textuels et les nomenclatures scientifiques r\u00e9pondent \u00e0 des crit\u00e8res d&rsquo;int\u00e9grit\u00e9 absolue avant toute phase de mod\u00e9lisation inf\u00e9rentielle.<\/p>\n<p>Le remplacement d&rsquo;un motif textuel ou de caract\u00e8res isol\u00e9s dans une variable alphanum\u00e9rique constitue une t\u00e2che programmatique quotidienne pour les d\u00e9veloppeurs SAS. Qu&rsquo;il s&rsquo;agisse de corriger des coquilles typographiques r\u00e9currentes issues d&rsquo;une saisie manuelle d\u00e9centralis\u00e9e, de standardiser des acronymes m\u00e9dicaux ou d&rsquo;\u00e9purer des identifiants d&rsquo;essais cliniques, la ma\u00eetrise des fonctions natives d\u00e9di\u00e9es au traitement des cha\u00eenes s&rsquo;av\u00e8re indispensable. La fonction <strong>TRANWRD<\/strong> se positionne au c\u0153ur de cette panoplie d&rsquo;outils, offrant un m\u00e9canisme d\u00e9terministe pour substituer des segments textuels sans alt\u00e9rer la coh\u00e9rence syntaxique globale de l&rsquo;observation.<\/p>\n<p>Cet article propose une exploration m\u00e9thodique, conceptuelle et pratique des m\u00e9canismes de substitution textuelle sous SAS. En articulant th\u00e9orie algorithmique du vecteur de donn\u00e9es de programme (<em>Program Data Vector<\/em> ou PDV) et \u00e9tudes de cas appliqu\u00e9es, ce guide d\u00e9taille l&rsquo;utilisation de la fonction TRANWRD, ses interactions avec les fonctions d&rsquo;\u00e9puration spatiale telles que COMPBL et STRIP, ainsi que ses distinctions fondamentales avec des instructions alternatives comme TRANSLATE et PRXCHANGE. Chaque concept est \u00e9tay\u00e9 par des impl\u00e9mentations compl\u00e8tes con\u00e7ues pour optimiser les performances de traitement sur des tables de production \u00e0 large \u00e9chelle.<\/p>\n<h2>1. Introduction au traitement des cha\u00eenes de caract\u00e8res en SAS et \u00e0 la fonction TRANWRD<\/h2>\n<h3>1.1 Fondements de la manipulation de texte dans l&rsquo;\u00e9cosyst\u00e8me SAS<\/h3>\n<p>Dans l&rsquo;architecture du langage SAS, les donn\u00e9es se divisent fondamentalement en deux types primitifs : le type num\u00e9rique et le type caract\u00e8re. Si les calculs matriciels et les mod\u00e9lisations stochastiques reposent sur les variables num\u00e9riques, les variables textuelles constituent la trame contextuelle indispensable \u00e0 la cat\u00e9gorisation, au partitionnement et \u00e0 l&rsquo;interpr\u00e9tation des ph\u00e9nom\u00e8nes observ\u00e9s. L&rsquo;int\u00e9grit\u00e9 des cha\u00eenes de caract\u00e8res s&rsquo;av\u00e8re critique : une discordance minime, telle qu&rsquo;une variation orthographique mineure ou la pr\u00e9sence d&rsquo;un espace parasite, scinde artificiellement une classe statistique en plusieurs strates disjointes lors de l&rsquo;ex\u00e9cution de proc\u00e9dures de fr\u00e9quence telles que la <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/p12n19z7k7omcon18h4sbf9t2576.htm\">PROC FREQ<\/a>.<\/p>\n<p>Le stockage en m\u00e9moire des variables textuelles s&rsquo;effectue sous un mod\u00e8le de longueur fixe au sein du vecteur de donn\u00e9es du programme. Lorsqu&rsquo;une variable alphanum\u00e9rique est allou\u00e9e dans une \u00e9tape DATA, SAS r\u00e9serve une plage continue d&rsquo;octets. Si la cha\u00eene stock\u00e9e est plus courte que l&rsquo;espace allou\u00e9, le syst\u00e8me comble le vide par des espaces de remplissage \u00e0 droite (<em>trailing blanks<\/em>). Cette particularit\u00e9 architecturale impose une vigilance constante lors des op\u00e9rations de concat\u00e9nation et de substitution, afin d&rsquo;\u00e9viter la g\u00e9n\u00e9ration involontaire de cha\u00eenes d\u00e9mesur\u00e9es ou, \u00e0 l&rsquo;inverse, la troncature brutale d&rsquo;informations signifiantes.<\/p>\n<p>Le nettoyage textuel pr\u00e9alable s&rsquo;inscrit ainsi comme une phase pivot de la gouvernance des donn\u00e9es. Les fonctions de manipulation de cha\u00eenes ne constituent pas de simples commodit\u00e9s syntaxiques ; elles repr\u00e9sentent les filtres d\u00e9terministes par lesquels les donn\u00e9es brutes h\u00e9t\u00e9rog\u00e8nes sont converties en attributs standardis\u00e9s, conformes aux exigences strictes des dictionnaires de donn\u00e9es institutionnels.<\/p>\n<h3>1.2 Pr\u00e9sentation g\u00e9n\u00e9rale et vocation de la fonction TRANWRD<\/h3>\n<p>La fonction <strong>TRANWRD<\/strong> (abr\u00e9viation de <em>Translate Word<\/em>) a \u00e9t\u00e9 con\u00e7ue pour r\u00e9soudre une probl\u00e9matique r\u00e9currente : rechercher toutes les occurrences d&rsquo;un motif textuel continu au sein d&rsquo;une cha\u00eene source et les remplacer par une s\u00e9quence de substitution d\u00e9sign\u00e9e. Introduite pour pallier la lourdeur des routines d&rsquo;extraction et de recombinaison manuelles, TRANWRD prend en charge de fa\u00e7on autonome le calcul des d\u00e9calages d&rsquo;indices et la r\u00e9allocation des sous-cha\u00eenes.<\/p>\n<p>Il convient de marquer une distinction op\u00e9ratoire fondamentale entre la substitution d&rsquo;une suite de caract\u00e8res ordonn\u00e9e et la transposition de caract\u00e8res isol\u00e9s. Contrairement aux fonctions qui op\u00e8rent caract\u00e8re par caract\u00e8re, TRANWRD consid\u00e8re la cible comme un bloc indivisible d&rsquo;octets. Si la cha\u00eene cible est compos\u00e9e de cinq lettres, l&rsquo;algorithme ne d\u00e9clenche l&rsquo;op\u00e9ration que lorsqu&rsquo;il d\u00e9tecte ces cinq lettres cons\u00e9cutives dans le m\u00eame ordre exact. La souplesse de cette fonction r\u00e9side \u00e9galement dans le fait que la cha\u00eene de remplacement ne requiert pas d&rsquo;avoir une longueur identique \u00e0 celle de la cha\u00eene cible.<\/p>\n<p>Historiquement, les programmeurs SAS recouraient \u00e0 des combinaisons complexes combinant les fonctions <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">INDEX<\/a> et SUBSTR pour localiser la position d&rsquo;un motif, d\u00e9couper la cha\u00eene en segments p\u00e9riph\u00e9riques et reconstruire l&rsquo;observation par concat\u00e9nation. L&rsquo;introduction de TRANWRD a permis d&rsquo;encapsuler cette logique it\u00e9rative dans une routine en code compil\u00e9 C sous-jacent, diminuant le nombre de lignes de code n\u00e9cessaires et r\u00e9duisant drastiquement le risque d&rsquo;erreurs de d\u00e9calage d&rsquo;index (<em>off-by-one errors<\/em>).<\/p>\n<h3>1.3 Cas d&rsquo;application fr\u00e9quents dans le traitement de donn\u00e9es empiriques<\/h3>\n<p>L&rsquo;exploitation pratique de TRANWRD s&rsquo;observe dans une multitude de domaines industriels et acad\u00e9miques. Dans la recherche \u00e9pid\u00e9miologique et les essais cliniques r\u00e9gis par les normes du consortium CDISC (<em>Clinical Data Interchange Standards Consortium<\/em>), la standardisation des \u00e9v\u00e9nements ind\u00e9sirables requiert l&rsquo;harmonisation de formulations vari\u00e9es saisies par les investigateurs m\u00e9dicaux. Par exemple, la conversion syst\u00e9matique des termes tels que \u00ab c\u00e9phal\u00e9e aigu\u00eb \u00bb ou \u00ab maux de t\u00eate \u00bb vers une nomenclature unifi\u00e9e conforme au dictionnaire MedDRA repose fr\u00e9quemment sur des tables de correspondances ex\u00e9cut\u00e9es via TRANWRD.<\/p>\n<p>Un deuxi\u00e8me cas d&rsquo;usage pr\u00e9dominant concerne l&rsquo;\u00e9radication des anomalies de saisie au sein des entrep\u00f4ts de donn\u00e9es transactionnels. Des erreurs syst\u00e9matiques caus\u00e9es par des d\u00e9faillances de lecteurs optiques, des saisies au clavier d\u00e9synchronis\u00e9es ou des transpositions de formats de dates peuvent \u00eatre intercept\u00e9es et neutralis\u00e9es \u00e0 l&rsquo;\u00e9chelle de millions d&rsquo;enregistrements. TRANWRD permet de corriger des segments erron\u00e9s r\u00e9currents sans affecter le reste des donn\u00e9es textuelles associ\u00e9es.<\/p>\n<p>Enfin, les exigences contemporaines en mati\u00e8re de protection de la vie priv\u00e9e, notamment sous l&rsquo;\u00e9gide du RGPD en Europe ou de la loi HIPAA aux \u00c9tats-Unis, imposent des protocoles stricts d&rsquo;anonymisation et de pseudonymisation. TRANWRD facilite le masquage syst\u00e9matique d&rsquo;identifiants directs, tels que des pr\u00e9fixes de num\u00e9ros de s\u00e9curit\u00e9 sociale, des noms d&rsquo;institutions ou des d\u00e9nominations de sites g\u00e9ographiques sensibles, en substituant ces mentions par des balises g\u00e9n\u00e9riques d&rsquo;anonymisation.<\/p>\n<h2>2. Syntaxe fondamentale et param\u00e8tres op\u00e9ratoires de la fonction TRANWRD<\/h2>\n<h3>2.1 D\u00e9composition de la signature de la fonction TRANWRD<\/h3>\n<p>La mise en \u0153uvre de la fonction TRANWRD repose sur une signature formelle stricte comportant trois arguments positionnels obligatoires. La syntaxe canonique s&rsquo;\u00e9nonce comme suit au sein d&rsquo;une expression d&rsquo;assignation dans l&rsquo;\u00e9tape DATA :<\/p>\n<p><code>nouvelle_variable = tranwrd(source, cible, remplacement);<\/code><\/p>\n<p>Le premier param\u00e8tre, d\u00e9sign\u00e9 par le terme <em>source<\/em>, repr\u00e9sente la variable de type caract\u00e8re ou l&rsquo;expression litt\u00e9rale au sein de laquelle la recherche doit \u00eatre op\u00e9r\u00e9e. Il s&rsquo;agit du vecteur textuel de r\u00e9f\u00e9rence qui sera parcouru par le moteur de recherche interne de SAS. Ce param\u00e8tre n&rsquo;est pas modifi\u00e9 en place dans le stockage initial, car SAS applique un paradigme fonctionnel pur o\u00f9 la variable d&rsquo;origine demeure intacte sauf si elle est explicitement r\u00e9assign\u00e9e.<\/p>\n<p>Le deuxi\u00e8me argument, nomm\u00e9 <em>cible<\/em> (ou <em>target string<\/em>), sp\u00e9cifie la sous-cha\u00eene exacte dont on souhaite rep\u00e9rer la pr\u00e9sence. Cette cible peut \u00eatre fournie sous la forme d&rsquo;une constante litt\u00e9rale entre apostrophes ou guillemets, ou provenir d&rsquo;une autre variable textuelle. Le troisi\u00e8me param\u00e8tre, nomm\u00e9 <em>remplacement<\/em> (ou <em>replacement string<\/em>), d\u00e9finit la s\u00e9quence de caract\u00e8res qui viendra se substituer \u00e0 chaque occurrence de la cible identifi\u00e9e. Il convient de souligner que sous SAS, l&rsquo;usage des guillemets simples ou doubles doit faire l&rsquo;objet d&rsquo;une rigueur absolue : l&rsquo;utilisation de guillemets doubles est requise lorsque la cha\u00eene implique la r\u00e9solution pr\u00e9alable d&rsquo;une variable macro, tandis que les guillemets simples sont pr\u00e9conis\u00e9s pour les cha\u00eenes statiques afin d&rsquo;\u00e9viter toute surcharge d&rsquo;interpr\u00e9tation par le processeur macro.<\/p>\n<h3>2.2 Sensibilit\u00e9 \u00e0 la casse et gestion des correspondances partielles<\/h3>\n<p>L&rsquo;algorithme sous-jacent \u00e0 la fonction TRANWRD applique une politique rigoureuse de sensibilit\u00e9 \u00e0 la casse (<em>case sensitivity<\/em>) bas\u00e9e sur la valeur binaire des octets sous le codage de session (qu&rsquo;il s&rsquo;agisse d&rsquo;ASCII, d&rsquo;EBCDIC ou d&rsquo;UTF-8). En cons\u00e9quence, le terme textuel \u00ab SAS \u00bb ne pr\u00e9sente aucune \u00e9quivalence avec \u00ab sas \u00bb ou \u00ab Sas \u00bb. Cette distinction stricte signifie que si la cible sp\u00e9cifi\u00e9e dans la fonction ne respecte pas scrupuleusement la configuration majuscule\/minuscule de l&rsquo;observation source, la substitution \u00e9chouera silencieusement, laissant la cha\u00eene source inchang\u00e9e sans g\u00e9n\u00e9rer d&rsquo;avertissement dans le journal (<em>SAS Log<\/em>).<\/p>\n<p>Pour neutraliser ce risque lors du traitement de donn\u00e9es issues d&rsquo;entr\u00e9es manuelles non contr\u00f4l\u00e9es, les ing\u00e9nieurs SAS adoptent une strat\u00e9gie d&rsquo;harmonisation morphologique pr\u00e9alable. Cette approche consiste \u00e0 encapsuler la variable source ou la cible dans les fonctions <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p1q34s5v0r4g6qn1upfv1j95504j.htm\">UPCASE<\/a> ou <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/n15tgy07z156m5n1w35j3a6v101n.htm\">LOWCASE<\/a>. Ainsi, en convertissant temporairement ou d\u00e9finitivement l&rsquo;ensemble de la cha\u00eene en lettres capitales avant l&rsquo;\u00e9valuation par TRANWRD, le programmeur garantit un appariement d\u00e9terministe, ind\u00e9pendamment des variations de saisie introduites par les op\u00e9rateurs humains.<\/p>\n<p>Il importe \u00e9galement de consid\u00e9rer la probl\u00e9matique des correspondances partielles non d\u00e9sir\u00e9es. \u00c9tant donn\u00e9 que TRANWRD recherche des motifs s\u00e9quentiels sans v\u00e9rifier les limites de mots (contrairement \u00e0 une analyse lexicale avanc\u00e9e), cibler la s\u00e9quence \u00ab car \u00bb dans une cha\u00eene provoquera indiff\u00e9remment la modification des mots isol\u00e9s \u00ab car \u00bb, mais \u00e9galement des sous-composantes incluses dans \u00ab pancarte \u00bb, \u00ab carton \u00bb ou \u00ab encadrer \u00bb. La pr\u00e9vention de ces effets collat\u00e9raux impose d&rsquo;encadrer la cible par des espaces d\u00e9lib\u00e9r\u00e9s ou de recourir \u00e0 des expressions r\u00e9guli\u00e8res lorsque le contexte s\u00e9mantique exige l&rsquo;isolation stricte des fronti\u00e8res lexicales.<\/p>\n<h3>2.3 M\u00e9canisme d&rsquo;ex\u00e9cution s\u00e9quentiel lors de la compilation de l&rsquo;\u00e9tape Data<\/h3>\n<p>Pour appr\u00e9hender pleinement le fonctionnement de TRANWRD, il est n\u00e9cessaire de d\u00e9tailler le comportement du moteur d&rsquo;ex\u00e9cution lors du cycle it\u00e9ratif de l&rsquo;\u00e9tape DATA. L&rsquo;analyse de la cha\u00eene s&rsquo;op\u00e8re selon un balayage lin\u00e9aire de gauche \u00e0 droite, octet par octet. D\u00e8s que la t\u00eate de lecture d\u00e9tecte une s\u00e9quence de caract\u00e8res correspondant bit \u00e0 bit \u00e0 l&rsquo;argument cible, elle interrompt la progression, extrait la sous-cha\u00eene cible, ins\u00e8re l&rsquo;int\u00e9gralit\u00e9 de la cha\u00eene de remplacement dans la m\u00e9moire tampon interm\u00e9diaire, puis reprend son analyse imm\u00e9diatement apr\u00e8s le dernier caract\u00e8re substitu\u00e9.<\/p>\n<p>Ce mode op\u00e9ratoire s\u00e9quentiel prot\u00e8ge l&rsquo;algorithme contre les boucles infinies lors de substitutions auto-r\u00e9f\u00e9rentielles. Par exemple, si l&rsquo;on demande \u00e0 TRANWRD de remplacer la lettre \u00ab A \u00bb par la s\u00e9quence \u00ab AA \u00bb, la fonction remplacera le premier \u00ab A \u00bb par \u00ab AA \u00bb, puis d\u00e9placera son pointeur d&rsquo;analyse apr\u00e8s le second \u00ab A \u00bb. Elle ne r\u00e9\u00e9valuera pas les caract\u00e8res nouvellement ins\u00e9r\u00e9s. Ce principe pr\u00e9serve la stabilit\u00e9 de l&rsquo;ex\u00e9cution et assure un temps de calcul pr\u00e9visible, proportionnel \u00e0 la longueur de la cha\u00eene d&rsquo;origine.<\/p>\n<p>Toutefois, la pr\u00e9sence d&rsquo;occurrences multiples au sein d&rsquo;une m\u00eame observation est g\u00e9r\u00e9e de mani\u00e8re exhaustive : chaque r\u00e9p\u00e9tition du motif cible subira la substitution sur l&rsquo;ensemble de la longueur textuelle disponible dans la variable. L&rsquo;op\u00e9ration s&rsquo;arr\u00eate uniquement lorsque le curseur atteint la fin de la variable source ou la limite maximale d&rsquo;octets allou\u00e9e \u00e0 la variable de r\u00e9ception dans le vecteur PDV.<\/p>\n<h2>3. M\u00e9thode 1 : Remplacement d&rsquo;une s\u00e9quence textuelle par une nouvelle cha\u00eene<\/h2>\n<h3>3.1 Principe th\u00e9orique de la substitution directe de motifs<\/h3>\n<p>Le sc\u00e9nario op\u00e9ratoire canonique de TRANWRD r\u00e9side dans le remplacement d&rsquo;un mot ou d&rsquo;un syntagme par une nouvelle formulation s\u00e9mantique. Du point de vue th\u00e9orique, cette op\u00e9ration r\u00e9alise une transduction textuelle locale : elle pr\u00e9serve rigoureusement les segments p\u00e9riph\u00e9riques situ\u00e9s en amont (pr\u00e9fixe textuel) et en aval (suffixe textuel) du point d&rsquo;impact, tout en modifiant dynamiquement la section centrale cibl\u00e9e.<\/p>\n<p>Lorsque la cha\u00eene de remplacement pr\u00e9sente un nombre d&rsquo;octets diff\u00e9rent de celui de la cible, SAS orchestre une translation physique des caract\u00e8res subs\u00e9quents. Si la cha\u00eene de substitution est plus volumineuse que la cible, l&rsquo;ensemble des caract\u00e8res post\u00e9rieurs est d\u00e9cal\u00e9 vers la droite, r\u00e9duisant d&rsquo;autant les espaces de remplissage disponibles en fin de cha\u00eene. Inversement, si le terme de remplacement est plus court, les caract\u00e8res post\u00e9rieurs sont translat\u00e9s vers la gauche, et le syst\u00e8me ins\u00e8re des espaces suppl\u00e9mentaires \u00e0 l&rsquo;extr\u00e9mit\u00e9 droite pour maintenir la dimension fixe assign\u00e9e \u00e0 la variable dans la table de donn\u00e9es.<\/p>\n<p>Ce m\u00e9canisme garantit le maintien absolu de la syntaxe globale des phrases ou des codes composites trait\u00e9s. Les d\u00e9limiteurs de champs, la ponctuation p\u00e9riph\u00e9rique et les structures syntaxiques non vis\u00e9es par le motif de recherche demeurent inchang\u00e9s, assurant une parfaite reproductibilit\u00e9 des transformations au fil des observations successives.<\/p>\n<h3>3.2 Impl\u00e9mentation d&rsquo;une nouvelle variable au sein de l&rsquo;\u00e9tape Data<\/h3>\n<p>Dans la pratique de programmation statistique, il est vivement d\u00e9conseill\u00e9 de r\u00e9\u00e9crire directement le r\u00e9sultat d&rsquo;une transformation textuelle sur la variable source d&rsquo;origine. Une telle pratique \u00e9crase l&rsquo;information brute et interdit toute tra\u00e7abilit\u00e9 ou audit des donn\u00e9es en aval. La convention m\u00e9thodologique reconnue consiste \u00e0 d\u00e9clarer une nouvelle variable r\u00e9ceptrice au sein de l&rsquo;\u00e9tape DATA pour accueillir le r\u00e9sultat produit par la fonction TRANWRD.<\/p>\n<p>L&rsquo;assignation prend ainsi la forme analytique suivante :<\/p>\n<p><code>libelle_standardise = tranwrd(libelle_brut, 'ANCIEN_TERME', 'NOUVEAU_TERME');<\/code><\/p>\n<p>L&rsquo;un des pi\u00e8ges les plus critiques lors de cette impl\u00e9mentation concerne la gestion implicite de la longueur d&rsquo;allocation m\u00e9moire par SAS. Par d\u00e9faut, si aucune instruction de dimensionnement pr\u00e9alable n&rsquo;a \u00e9t\u00e9 sp\u00e9cifi\u00e9e pour la variable <code>libelle_standardise<\/code>, le compilateur SAS peut lui attribuer la longueur de la variable source, ou une longueur par d\u00e9faut de 200 octets selon le contexte de l&rsquo;expression. Si le motif de remplacement est nettement plus long que le motif cible et que les donn\u00e9es initiales occupent une part importante de l&rsquo;espace allou\u00e9, le r\u00e9sultat final peut subir une troncature silencieuse d\u00e9sastreuse. Il est donc formellement imp\u00e9ratif d&rsquo;adjoindre une instruction LENGTH explicite en amont de toute manipulation textuelle par TRANWRD.<\/p>\n<h3>3.3 Exemples conceptuels de restructuration s\u00e9mantique<\/h3>\n<p>Consid\u00e9rons la gestion de nomenclatures organisationnelles ou hospitali\u00e8res \u00e9volutives au fil du temps. Dans le cadre d&rsquo;une \u00e9tude observationnelle men\u00e9e sur une d\u00e9cennie, les identifiants textuels de certains services hospitaliers changent fr\u00e9quemment de d\u00e9nomination officielle. Un service historiquement \u00e9tiquet\u00e9 \u00ab Unit\u00e9 de Soins Intensifs 1 \u00bb peut avoir \u00e9t\u00e9 rebaptis\u00e9 \u00ab D\u00e9partement de R\u00e9animation M\u00e9dicale \u00bb.<\/p>\n<p>L&rsquo;utilisation de TRANWRD permet d&rsquo;harmoniser les historiques sans d\u00e9naturer les sous-identifiants de lits ou de pavillons inclus dans la m\u00eame cha\u00eene. De m\u00eame, la gestion des acronymes techniques b\u00e9n\u00e9ficie directement de cette flexibilit\u00e9 : remplacer syst\u00e9matiquement le terme abr\u00e9g\u00e9 \u00ab HTA \u00bb par \u00ab Hypertension Art\u00e9rielle \u00bb permet de pr\u00e9parer des rapports automatis\u00e9s destin\u00e9s \u00e0 un lectorat m\u00e9dical non sp\u00e9cialis\u00e9, sans obliger le statisticien \u00e0 diss\u00e9quer la cha\u00eene par des fonctions complexes de parsing positionnel.<\/p>\n<p>Un autre cas repr\u00e9sentatif concerne la modernisation de classifications nosologiques obsol\u00e8tes au sein de bases m\u00e9dico-administratives historiques. Lorsqu&rsquo;une terminologie diagnostique est r\u00e9\u00e9valu\u00e9e au cours du cycle de vie d&rsquo;un registre \u00e9pid\u00e9miologique, l&rsquo;insertion de TRANWRD au sein des scripts d&rsquo;importation permet de garantir que les s\u00e9ries temporelles d&rsquo;indicateurs demeurent parfaitement comparables d&rsquo;une cohorte \u00e0 l&rsquo;autre.<\/p>\n<h2>4. M\u00e9thode 2 : Suppression de motifs par substitution d&rsquo;espaces vides<\/h2>\n<h3>4.1 Substitution d&rsquo;un terme par une cha\u00eene nulle (suppression logique)<\/h3>\n<p>Une fonctionnalit\u00e9 particuli\u00e8rement puissante mais parfois mal comprise de TRANWRD r\u00e9side dans sa capacit\u00e9 \u00e0 op\u00e9rer l&rsquo;effacement pur et simple d&rsquo;un motif textuel. Cette suppression logique s&rsquo;obtient en fournissant une cha\u00eene vide en guise de troisi\u00e8me argument op\u00e9rationnel. Dans la syntaxe du langage SAS, la cha\u00eene vide est repr\u00e9sent\u00e9e par deux apostrophes cons\u00e9cutives sans aucun caract\u00e8re interm\u00e9diaire (<code>''<\/code>) ou deux guillemets doubles non espac\u00e9s (<code>\"\"<\/code>).<\/p>\n<p>L&rsquo;instruction s&rsquo;articule comme suit :<\/p>\n<p><code>chaine_epuree = tranwrd(chaine_source, 'MOTIF_A_SUPPRIMER', '');<\/code><\/p>\n<p>Sur le plan m\u00e9canique, d\u00e8s que la fonction identifie la cible sp\u00e9cifi\u00e9e, elle l&rsquo;\u00e9limine du flux textuel sans ins\u00e9rer le moindre octet de substitution. Les caract\u00e8res contigus situ\u00e9s imm\u00e9diatement \u00e0 droite du motif cible sont alors imm\u00e9diatement rattach\u00e9s aux caract\u00e8res situ\u00e9s imm\u00e9diatement \u00e0 gauche. Il est crucial de distinguer cette op\u00e9ration d&rsquo;effacement de l&rsquo;insertion d&rsquo;un espace typographique (<code>' '<\/code>). Sp\u00e9cifier un espace entre les guillemets n&rsquo;efface pas le motif : cela le remplace par un blanc d&rsquo;espacement, ce qui produit un impact structurel radicalement distinct sur la g\u00e9om\u00e9trie de la cha\u00eene.<\/p>\n<h3>4.2 Gestion des art\u00e9facts et espaces r\u00e9siduels cons\u00e9cutifs<\/h3>\n<p>Bien que l&rsquo;effacement par substitution d&rsquo;une cha\u00eene nulle soit syntaxiquement \u00e9l\u00e9gant, il engendre fr\u00e9quemment des effets secondaires au niveau de la typographie textuelle. L&rsquo;artefact le plus classique se manifeste lorsque le motif supprim\u00e9 correspondait \u00e0 un mot m\u00e9dian complet au sein d&rsquo;une phrase. Dans une telle circonstance, le mot \u00e9limin\u00e9 \u00e9tait originellement pr\u00e9c\u00e9d\u00e9 et suivi d&rsquo;un espace de s\u00e9paration lexical.<\/p>\n<p>La suppression directe du mot cible sans \u00e9limination concomitante de ses d\u00e9limiteurs laisse subsister les deux espaces adjacents, lesquels se retrouvent d\u00e9sormais juxtapos\u00e9s. Il en r\u00e9sulte un double espace r\u00e9siduel (<em>double blank<\/em>) au c\u0153ur de la cha\u00eene de caract\u00e8res. De m\u00eame, si le motif extrait se situait au d\u00e9but ou \u00e0 la fin absolue de la cha\u00eene, l&rsquo;op\u00e9ration g\u00e9n\u00e8re des espaces parasites de bordure (espaces de t\u00eate ou de queue).<\/p>\n<p>Ces espaces r\u00e9siduels ne constituent pas seulement une imperfection esth\u00e9tique sur les rapports de sortie : ils risquent d&rsquo;alt\u00e9rer les op\u00e9rations ult\u00e9rieures de partitionnement bas\u00e9es sur des d\u00e9limiteurs simples (comme les fonctions SCAN ou INDEX) et de fausser le d\u00e9compte exact du nombre d&rsquo;unit\u00e9s lexicales. Par cons\u00e9quent, toute strat\u00e9gie de suppression de motif via TRANWRD doit obligatoirement s&rsquo;accompagner d&rsquo;une phase de post-traitement d\u00e9di\u00e9e \u00e0 la normalisation des blancs.<\/p>\n<h3>4.3 Cas d&rsquo;usage : Purge de pr\u00e9fixes et suffixes r\u00e9currents<\/h3>\n<p>La suppression cibl\u00e9e de sous-cha\u00eenes via TRANWRD trouve une utilit\u00e9 pratique majeure dans l&rsquo;assainissement d&rsquo;identifiants administratifs encombr\u00e9s de pr\u00e9fixes techniques redondants. Dans de nombreux syst\u00e8mes de gestion hospitali\u00e8re ou bancaire, les identifiants d&rsquo;enregistrements sont pr\u00e9fix\u00e9s par des codes d&rsquo;application tels que \u00ab ID_PROD_ \u00bb ou \u00ab CLIENT_NUM_ \u00bb.<\/p>\n<p>Lorsque ces identifiants doivent \u00eatre convertis en cl\u00e9s de jointure standardis\u00e9es ou export\u00e9s vers des syst\u00e8mes relationnels externes, la suppression syst\u00e9matique de ces pr\u00e9fixes se r\u00e9v\u00e8le indispensable. L&rsquo;application s\u00e9quentielle de TRANWRD ciblant ces balises fixes permet de ramener l&rsquo;identifiant \u00e0 sa composante strictement signifiante, r\u00e9duisant au passage l&rsquo;encombrement volum\u00e9trique de la variable en m\u00e9moire.<\/p>\n<p>Cette approche s&rsquo;applique identiquement au nettoyage des suffixes de versions de documents (tels que \u00ab _v1_final \u00bb, \u00ab _rev2 \u00bb) au sein des m\u00e9tadonn\u00e9es de suivi d&rsquo;essais cliniques, facilitant le regroupement automatique de documents appartenant au m\u00eame protocole fondamental ind\u00e9pendamment de leurs it\u00e9rations de r\u00e9daction.<\/p>\n<h2>5. D\u00e9monstration pratique : Cr\u00e9ation et inspection du jeu de donn\u00e9es exp\u00e9rimental<\/h2>\n<h3>5.1 G\u00e9n\u00e9ration de la table originale via l&rsquo;\u00e9tape Data et DATALINES<\/h3>\n<p>Afin d&rsquo;illustrer concr\u00e8tement les comportements d\u00e9crits ci-dessus, nous \u00e9laborons un jeu de donn\u00e9es exp\u00e9rimental structur\u00e9 simulant un registre de d\u00e9nominations d&rsquo;\u00e9quipes de comp\u00e9tition sportive. Ce sc\u00e9nario classique permet de manipuler des cha\u00eenes combinant des adjectifs qualificatifs r\u00e9currents et des noms d&rsquo;animaux, pr\u00e9sentant des variations lexicales contr\u00f4l\u00e9es propices aux tests de substitution textuelle.<\/p>\n<p>L&rsquo;\u00e9tape DATA suivante proc\u00e8de \u00e0 la cr\u00e9ation de la table initiale d\u00e9sign\u00e9e sous le nom de <code>ORIGINAL_TEAMS<\/code>. Elle exploite l&rsquo;instruction INPUT associ\u00e9e au descripteur de format alphanum\u00e9rique direct <code>$1-20<\/code>, garantissant que chaque ligne du bloc DATALINES est lue de fa\u00e7on rigoureusement reproductible sur une largeur fixe de 20 octets :<\/p>\n<p><code>data original_teams;<br \/>\n&nbsp;&nbsp;input team $1-20;<br \/>\ndatalines;<br \/>\nWild Mustangs<br \/>\nAngry Bees<br \/>\nWild Cheetahs<br \/>\nKind Panthers<br \/>\nWild Aardvarks<br \/>\n;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;instruction <code>DATALINES<\/code> permet d&rsquo;int\u00e9grer directement le corpus de test au sein du script SAS, \u00e9liminant ainsi toute d\u00e9pendance \u00e0 un fichier plat externe pour cette d\u00e9monstration. Le jeu de donn\u00e9es g\u00e9n\u00e9r\u00e9 comporte cinq observations distinctes, int\u00e9grant trois occurrences du terme cible \u00ab Wild \u00bb au d\u00e9but des cha\u00eenes de caract\u00e8res, ainsi que deux observations de contr\u00f4le (\u00ab Angry Bees \u00bb et \u00ab Kind Panthers \u00bb) qui permettront de valider la neutralit\u00e9 de l&rsquo;algorithme face aux modalit\u00e9s non cibl\u00e9es.<\/p>\n<h3>5.2 Validation du jeu de donn\u00e9es \u00e0 l&rsquo;aide de PROC PRINT<\/h3>\n<p>Pr\u00e9alablement \u00e0 toute transformation algorithmique, une bonne pratique de programmation SAS consiste \u00e0 valider empiriquement la structure et le contenu de la table de d\u00e9part \u00e0 l&rsquo;aide de la proc\u00e9dure g\u00e9n\u00e9rique <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/p0h72b1uqu3dren1s6u54d6q9y66.htm\">PROC PRINT<\/a>. Cette \u00e9tape confirme que les donn\u00e9es ont \u00e9t\u00e9 ing\u00e9r\u00e9es sans d\u00e9calage de colonne et que l&rsquo;espace m\u00e9moire allou\u00e9 correspond exactement aux sp\u00e9cifications requises.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/replacesas1.jpg\" alt=\"\" \/><\/figure>\n<p>Le code SAS d&rsquo;inspection s&rsquo;ex\u00e9cute simplement :<\/p>\n<p><code>proc print data=original_teams noobs;<br \/>\n&nbsp;&nbsp;title 'Inspection de la Table Originale des \u00c9quipes';<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;option <code>noobs<\/code> est ici sp\u00e9cifi\u00e9e pour supprimer l&rsquo;affichage du num\u00e9ro d&rsquo;observation par d\u00e9faut, fournissant une sortie \u00e9pur\u00e9e ax\u00e9e exclusivement sur le vecteur textuel \u00e9tudi\u00e9. L&rsquo;examen attentif du journal SAS confirme la cr\u00e9ation de la table WORK.ORIGINAL_TEAMS avec 5 observations et 1 variable. Cette validation documentaire \u00e9tablit la r\u00e9f\u00e9rence par rapport \u00e0 laquelle le diff\u00e9rentiel d&rsquo;\u00e9tat post-transformation sera mesur\u00e9.<\/p>\n<h3>5.3 Analyse structurelle des donn\u00e9es d&rsquo;exemple<\/h3>\n<p>L&rsquo;analyse morphologique du corpus met en \u00e9vidence plusieurs propri\u00e9t\u00e9s essentielles. Premi\u00e8rement, la cible \u00ab Wild \u00bb est positionn\u00e9e de mani\u00e8re r\u00e9p\u00e9titive en d\u00e9but absolu de cha\u00eene (indices 1 \u00e0 4). Deuxi\u00e8mement, les noms de cr\u00e9atures qui lui succ\u00e8dent pr\u00e9sentent des longueurs tr\u00e8s disparates : \u00ab Mustangs \u00bb compte 8 caract\u00e8res, \u00ab Cheetahs \u00bb en compte 8, tandis que \u00ab Aardvarks \u00bb en compte 9.<\/p>\n<p>Cette variabilit\u00e9 de longueur au sein du second mot permet de v\u00e9rifier que la substitution op\u00e9r\u00e9e sur le premier segment n&rsquo;entra\u00eene aucune corruption de pointeur sur le segment terminal, quel que soit l&rsquo;encombrement lexical de ce dernier. Par ailleurs, la pr\u00e9sence de noms compos\u00e9s d\u00e9montre la capacit\u00e9 de la table \u00e0 tester le maintien des d\u00e9limiteurs interm\u00e9diaires (les espaces simples s\u00e9parant l&rsquo;adjectif du substantif animalier).<\/p>\n<p>Enfin, les deux enregistrements neutres contenant les qualificatifs \u00ab Angry \u00bb et \u00ab Kind \u00bb permettent de v\u00e9rifier l&rsquo;absence d&rsquo;effets de bord, s&rsquo;assurant que la fonction ne produit pas d&rsquo;assignation erron\u00e9e ou de valeur manquante lorsqu&rsquo;un enregistrement ne pr\u00e9sente pas l&#8217;empreinte textuelle recherch\u00e9e.<\/p>\n<h2>6. Cas pratique d&rsquo;application : Substitution lexicale cibl\u00e9e au sein d&rsquo;une variable<\/h2>\n<h3>6.1 Mise en \u0153uvre du remplacement du motif &lsquo;Wild&rsquo; par &lsquo;Fast&rsquo;<\/h3>\n<p>Nous abordons d\u00e9sormais l&rsquo;ex\u00e9cution concr\u00e8te de la substitution lexicale. L&rsquo;objectif analytique consiste \u00e0 standardiser la nomenclature sportive en rempla\u00e7ant syst\u00e9matiquement le qualificatif \u00ab Wild \u00bb par la d\u00e9signation moderne \u00ab Fast \u00bb, tout en pr\u00e9servant l&rsquo;int\u00e9grit\u00e9 int\u00e9grale de l&rsquo;animal tot\u00e9mique associ\u00e9. Pour mener \u00e0 bien cette op\u00e9ration, une nouvelle \u00e9tape DATA est initi\u00e9e, lisant la table <code>original_teams<\/code> et cr\u00e9ant la table d\u00e9riv\u00e9e <code>new_teams_data<\/code>.<\/p>\n<p>L&rsquo;instruction fondamentale s&rsquo;impl\u00e9mente comme suit :<\/p>\n<p><code>data new_teams_data;<br \/>\n&nbsp;&nbsp;set original_teams;<br \/>\n&nbsp;&nbsp;length new_team $ 25;<br \/>\n&nbsp;&nbsp;new_team = tranwrd(team, 'Wild', 'Fast');<br \/>\nrun;<\/code><\/p>\n<p>Lors de l&rsquo;ex\u00e9cution s\u00e9quentielle, SAS lit chaque observation de la table source une \u00e0 une et la charge dans le vecteur PDV. La fonction TRANWRD inspecte le contenu de la variable <code>team<\/code>. Lorsqu&rsquo;elle identifie le segment \u00ab Wild \u00bb, elle effectue la substitution par \u00ab Fast \u00bb. Il importe de noter qu&rsquo;en termes de comptage de caract\u00e8res, \u00ab Wild \u00bb et \u00ab Fast \u00bb pr\u00e9sentent exactement le m\u00eame nombre d&rsquo;octets (4 caract\u00e8res). Il s&rsquo;agit donc d&rsquo;une substitution isomorphe en longueur, ce qui simplifie la gestion spatiale, bien que l&rsquo;instruction <code>length new_team $ 25;<\/code> ait \u00e9t\u00e9 judicieusement d\u00e9clar\u00e9e en amont par pr\u00e9caution m\u00e9thodologique.<\/p>\n<h3>6.2 Contr\u00f4le des r\u00e9sultats par inspection du nouveau jeu de donn\u00e9es<\/h3>\n<p>Pour attester formellement de la conformit\u00e9 du traitement appliqu\u00e9, une proc\u00e9dure d&rsquo;impression analytique est ex\u00e9cut\u00e9e sur la table nouvellement cr\u00e9\u00e9e :<\/p>\n<p><code>proc print data=new_teams_data noobs;<br \/>\n&nbsp;&nbsp;title 'Validation de la Substitution Lexicale Cibl\u00e9e';<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;inspection du tableau de sortie confirme la parfaite r\u00e9ussite de l&rsquo;algorithme. Les trois entit\u00e9s d&rsquo;int\u00e9r\u00eat ont \u00e9t\u00e9 modifi\u00e9es de fa\u00e7on chirurgicale : \u00ab Wild Mustangs \u00bb s&rsquo;est m\u00e9tamorphos\u00e9 en \u00ab Fast Mustangs \u00bb, \u00ab Wild Cheetahs \u00bb est devenu \u00ab Fast Cheetahs \u00bb, et \u00ab Wild Aardvarks \u00bb a \u00e9t\u00e9 converti en \u00ab Fast Aardvarks \u00bb.<\/p>\n<p>Parall\u00e8lement, les observations de contr\u00f4le ont fait preuve d&rsquo;une r\u00e9silience structurelle absolue : \u00ab Angry Bees \u00bb et \u00ab Kind Panthers \u00bb n&rsquo;ont subi aucune modification, ni alt\u00e9ration de format, ni d\u00e9placement spatial. Cette inspection visuelle et programmatique valide le comportement d\u00e9terministe de la fonction TRANWRD dans le cadre de transformations lexicales sous SAS.<\/p>\n<h3>6.3 Interpr\u00e9tation analytique du comportement s\u00e9lectif de SAS<\/h3>\n<p>Le succ\u00e8s de cette op\u00e9ration repose sur l&rsquo;orthogonalit\u00e9 de l&rsquo;\u00e9valuation textuelle sous SAS. Si l&rsquo;on d\u00e9compose le flux de traitement de la ligne d&rsquo;affectation, la fonction TRANWRD ne r\u00e9\u00e9value pas l&rsquo;int\u00e9gralit\u00e9 du contexte s\u00e9mantique ; elle se borne \u00e0 v\u00e9rifier une correspondance binaire stricte. L&rsquo;invariance des observations neutres d\u00e9montre que le m\u00e9canisme ne produit aucun effet de bord non document\u00e9.<\/p>\n<p>Sur le plan du dimensionnement m\u00e9moire, le choix d\u00e9lib\u00e9r\u00e9 d&rsquo;utiliser deux termes de longueur identique (4 octets chacun) a permis de pr\u00e9server exactement l&#8217;emplacement des espaces de queue originels. La structure du vecteur de donn\u00e9es n&rsquo;a subi aucune distorsion d&rsquo;alignement. Cette stabilit\u00e9 est pr\u00e9cieuse lors de traitements industriels massifs impliquant plusieurs dizaines de millions de lignes, car elle \u00e9vite au moteur de pagination de SAS d&rsquo;avoir \u00e0 recalculer dynamiquement des adresses m\u00e9moire complexes pour les variables de sortie.<\/p>\n<p>Cette s\u00e9lectivit\u00e9 op\u00e9ratoire conf\u00e8re \u00e0 TRANWRD une fiabilit\u00e9 sup\u00e9rieure pour les pipelines ETL (<em>Extract, Transform, Load<\/em>) automatis\u00e9s, o\u00f9 l&rsquo;introduction involontaire de valeurs manquantes dues \u00e0 des d\u00e9faillances de parsing textuel constitue un risque op\u00e9rationnel majeur.<\/p>\n<h2>7. Gestion des espaces r\u00e9siduels et normalisation des cha\u00eenes avec COMPBL et STRIP<\/h2>\n<h3>7.1 Probl\u00e9matique des espaces doubles apr\u00e8s suppression par TRANWRD<\/h3>\n<p>Lorsque la fonction TRANWRD est employ\u00e9e pour supprimer un terme sans le remplacer par une nouvelle s\u00e9quence (en utilisant la cha\u00eene vide <code>''<\/code>), une dysharmonie spatiale \u00e9merge in\u00e9vitablement au sein de la cha\u00eene de sortie. Supposons une variable contenant la mention \u00ab Protocole B\u00eata Phase III \u00bb. Si une directive m\u00e9thodologique impose la suppression du qualificatif interm\u00e9diaire \u00ab B\u00eata \u00bb, l&rsquo;application stricte de <code>tranwrd(source, 'B\u00eata', '')<\/code> produira la cha\u00eene suivante : \u00ab Protocole &nbsp;Phase III \u00bb.<\/p>\n<p>L&rsquo;examen minutieux de ce r\u00e9sultat met en \u00e9vidence un espace double au niveau de la zone de suppression. L&rsquo;espace qui pr\u00e9c\u00e9dait \u00ab B\u00eata \u00bb et l&rsquo;espace qui lui succ\u00e9dait n&rsquo;ont pas \u00e9t\u00e9 absorb\u00e9s par l&rsquo;op\u00e9ration de suppression ; ils demeurent contigus dans la cha\u00eene de caract\u00e8res r\u00e9ceptrice. Cet espacement anarchique constitue une anomalie g\u00eanante tant pour l&rsquo;esth\u00e9tique des rapports destin\u00e9s aux comit\u00e9s de pilotage que pour la rigueur des requ\u00eates SQL ult\u00e9rieures, o\u00f9 la condition d&rsquo;\u00e9galit\u00e9 stricte <code>libelle = 'Protocole Phase III'<\/code> \u00e9chouera lamentablement face \u00e0 une observation contenant deux espaces interm\u00e9diaires.<\/p>\n<p>Ce ph\u00e9nom\u00e8ne s&rsquo;aggrave lorsque des suppressions multiples sont encha\u00een\u00e9es au sein d&rsquo;une m\u00eame instruction : des agr\u00e9gats de trois ou quatre espaces cons\u00e9cutifs peuvent se former, transformant la cha\u00eene en une structure textuelle fragment\u00e9e particuli\u00e8rement instable.<\/p>\n<h3>7.2 Application combin\u00e9e de la fonction COMPBL pour compresser les blancs<\/h3>\n<p>Pour rem\u00e9dier \u00e9l\u00e9gamment \u00e0 cette d\u00e9t\u00e9rioration spatiale sans recourir \u00e0 des boucles conditionnelles fastidieuses, l&rsquo;\u00e9cosyst\u00e8me SAS met \u00e0 disposition la fonction <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">COMPBL<\/a> (contraction de <em>Compress Blanks<\/em>). Le r\u00f4le algorithmique unique de COMPBL consiste \u00e0 balayer la cha\u00eene de caract\u00e8res et \u00e0 r\u00e9duire instantan\u00e9ment toute s\u00e9quence de plusieurs espaces cons\u00e9cutifs en un seul et unique espace typographique.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/replacesas2.jpg\" alt=\"\" \/><\/figure>\n<p>L&rsquo;imbrication syntaxique de ces deux outils offre un motif de conception particuli\u00e8rement puissant et compact dans l&rsquo;\u00e9tape DATA :<\/p>\n<p><code>chaine_propre = compbl(tranwrd(source, 'MOTIF', ''));<\/code><\/p>\n<p>Dans ce mod\u00e8le d&rsquo;ex\u00e9cution, la fonction interne TRANWRD op\u00e8re en premier lieu, extrayant le mot cibl\u00e9 et laissant temporairement des espaces doubles ou triples dans la m\u00e9moire tampon. Imm\u00e9diatement apr\u00e8s, la fonction externe COMPBL prend en charge le r\u00e9sultat interm\u00e9diaire, collapse l&rsquo;ensemble des blancs redondants en espaces simples, et d\u00e9livre une cha\u00eene parfaitement cadenc\u00e9e sur le plan lexical. Cette composition de fonctions s&rsquo;ex\u00e9cute de fa\u00e7on atomique au sein du processeur, garantissant une efficacit\u00e9 computationnelle maximale.<\/p>\n<h3>7.3 \u00c9limination des espaces de bordure via TRIM, STRIP et LEFT<\/h3>\n<p>Si la fonction COMPBL r\u00e9sout impeccablement l&rsquo;\u00e9cueil des espaces interm\u00e9diaires redondants, elle ne traite pas de mani\u00e8re exhaustive le probl\u00e8me des espaces situ\u00e9s aux extr\u00e9mit\u00e9s d&rsquo;une cha\u00eene. En effet, si le mot supprim\u00e9 par TRANWRD se situait au d\u00e9but absolu de la variable, la cha\u00eene r\u00e9sultante d\u00e9butera par un espace d&rsquo;indentation. Si le mot se situait \u00e0 la fin, elle comportera un espace r\u00e9siduel avant les espaces de bourrage syst\u00e8me.<\/p>\n<p>Pour assainir int\u00e9gralement les fronti\u00e8res de la cha\u00eene, les programmeurs disposent d&rsquo;un ensemble de fonctions de cadrage spatial :<\/p>\n<ul>\n<li><strong>LEFT<\/strong> : d\u00e9cale la totalit\u00e9 de la cha\u00eene vers la gauche de mani\u00e8re \u00e0 ce que le premier caract\u00e8re signifiant occupe la premi\u00e8re position en m\u00e9moire, d\u00e9pla\u00e7ant tous les espaces initiaux vers la fin de la variable.<\/li>\n<li><strong>TRIM<\/strong> : supprime logiquement les espaces de fin (<em>trailing blanks<\/em>) lors de concat\u00e9nations ult\u00e9rieures, bien qu&rsquo;au sein du vecteur fixe d&rsquo;une table SAS, les espaces de fin r\u00e9apparaissent si la variable r\u00e9ceptrice poss\u00e8de une longueur d\u00e9clar\u00e9e sup\u00e9rieure.<\/li>\n<li><strong>STRIP<\/strong> : combine les actions de LEFT et de TRIM, \u00e9liminant simultan\u00e9ment les espaces initiaux et finaux en une seule passe algorithmique.<\/li>\n<\/ul>\n<p>La r\u00e8gle d&rsquo;or pour un assainissement textuel irr\u00e9prochable consiste ainsi \u00e0 \u00e9riger un pipeline de fonctions imbriqu\u00e9es :<\/p>\n<p><code>libelle_final = strip(compbl(tranwrd(libelle_brut, 'MOTIF', '')));<\/code><\/p>\n<p>Cette instruction condens\u00e9e garantit que le motif est \u00e9radiqu\u00e9, que les \u00e9ventuels espaces doubles internes sont r\u00e9duits \u00e0 des espaces simples, et qu&rsquo;aucun espace parasite ne subsiste en marge gauche ou droite de l&rsquo;enregistrement finalis\u00e9.<\/p>\n<h2>8. Analyse comparative : TRANWRD versus TRANSLATE dans l&rsquo;environnement SAS<\/h2>\n<h3>8.1 Divergence de paradigme : Remplacement de cha\u00eenes vs substitution de caract\u00e8res<\/h3>\n<p>Une confusion s\u00e9mantique extr\u00eamement r\u00e9pandue parmi les analystes juniors sous SAS r\u00e9side dans l&rsquo;assimilation erron\u00e9e entre la fonction TRANWRD et la fonction <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">TRANSLATE<\/a>. Bien que leurs d\u00e9nominations respectives \u00e9voquent un concept fonctionnel similaire de traduction ou de substitution, leurs architectures fondamentales reposent sur des paradigmes radicalement oppos\u00e9s.<\/p>\n<p>La fonction <strong>TRANWRD<\/strong> traite les cha\u00eenes en tant qu&rsquo;unit\u00e9s s\u00e9mantiques continues de longueur arbitraire. Elle substitue un <em>bloc<\/em> par un autre <em>bloc<\/em>. En revanche, la fonction <strong>TRANSLATE<\/strong> op\u00e8re exclusivement une transposition positionnelle <em>caract\u00e8re par caract\u00e8re<\/em> (au niveau d&rsquo;octets isol\u00e9s). TRANSLATE ne comprend pas la notion de mot : elle lit une liste de caract\u00e8res individuels et les remplace syst\u00e9matiquement par une autre liste de caract\u00e8res individuels selon un ordre d&rsquo;indice strict.<\/p>\n<p>Confondre ces deux fonctions peut engendrer des corruptions de donn\u00e9es catastrophiques. Si un programmeur cherche \u00e0 remplacer l&rsquo;acronyme \u00ab US \u00bb par \u00ab UK \u00bb en utilisant par inadvertance TRANSLATE au lieu de TRANWRD sur une cha\u00eene longue, la fonction ne cherchera pas le mot \u00ab US \u00bb : elle transformera chaque lettre \u00ab U \u00bb rencontr\u00e9e dans la phrase en la lettre \u00ab U \u00bb de remplacement correspondante, et chaque lettre \u00ab S \u00bb isol\u00e9e sera syst\u00e9matiquement convertie en \u00ab K \u00bb. Le mot \u00ab STATUS \u00bb deviendrait ainsi \u00ab STATUK \u00bb, illustrant la d\u00e9naturation lexicale engendr\u00e9e par cette m\u00e9prise.<\/p>\n<h3>8.2 Syntaxe et cas d&rsquo;\u00e9cole pour la fonction TRANSLATE<\/h3>\n<p>La signature de TRANSLATE diff\u00e8re \u00e9galement de celle de TRANWRD par l&rsquo;ordre de ses arguments, ce qui constitue une source additionnelle de fautes de programmation :<\/p>\n<p><code>variable_corrigee = translate(source, to_chars, from_chars);<\/code><\/p>\n<p>Dans cette syntaxe, le param\u00e8tre <code>source<\/code> reste la cha\u00eene initiale, mais le deuxi\u00e8me argument repr\u00e9sente les caract\u00e8res d&rsquo;arriv\u00e9e (<em>to_chars<\/em>) et le troisi\u00e8me argument regroupe les caract\u00e8res d&rsquo;origine \u00e0 convertir (<em>from_chars<\/em>). L&rsquo;alignement est strictement positionnel : le premier caract\u00e8re de <code>from_chars<\/code> est converti dans le premier caract\u00e8re de <code>to_chars<\/code>, le deuxi\u00e8me dans le deuxi\u00e8me, et ainsi de suite.<\/p>\n<p>Le cas d&rsquo;\u00e9cole optimal pour l&#8217;emploi de TRANSLATE r\u00e9side dans l&rsquo;\u00e9radication des caract\u00e8res diacritiques ou accents dans les environnements non-Unicode, ou la normalisation des s\u00e9parateurs d\u00e9cimaux et typographiques. Par exemple, pour transformer tous les caract\u00e8res accentu\u00e9s fran\u00e7ais en leurs \u00e9quivalents stricts sans accent, TRANSLATE surpasse TRANWRD en termes de rapidit\u00e9 et d&rsquo;\u00e9l\u00e9gance :<\/p>\n<p><code>sans_accents = translate(nom, 'eeeeaiuoc', '\u00e9\u00e8\u00ea\u00eb\u00e0\u00ee\u00fb\u00f4\u00e7');<\/code><\/p>\n<p>Cette instruction unique r\u00e9alise neuf substitutions distinctes en une seule passe processeur au niveau de chaque caract\u00e8re du vecteur, une prouesse qui n\u00e9cessiterait neuf appels imbriqu\u00e9s distincts si l&rsquo;on devait l&rsquo;ex\u00e9cuter \u00e0 l&rsquo;aide de TRANWRD.<\/p>\n<h3>8.3 Tableau d\u00e9cisionnel : Quelle fonction employer selon le contexte ?<\/h3>\n<p>Afin de structurer le processus de d\u00e9cision logicielle au sein des \u00e9quipes de d\u00e9veloppement SAS, le tableau comparatif ci-dessous synth\u00e9tise les propri\u00e9t\u00e9s discriminantes des deux instructions :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin-top: 15px;margin-bottom: 20px\">\n<thead>\n<tr style=\"background-color: #f2f2f2;text-align: left\">\n<th>Crit\u00e8re de comparaison<\/th>\n<th>Fonction TRANWRD<\/th>\n<th>Fonction TRANSLATE<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Unit\u00e9 de traitement<\/strong><\/td>\n<td>Cha\u00eene continue, sous-cha\u00eene ou mot indivisible<\/td>\n<td>Caract\u00e8res isol\u00e9s analys\u00e9s unitairement (1 \u00e0 1)<\/td>\n<\/tr>\n<tr>\n<td><strong>Longueur des motifs<\/strong><\/td>\n<td>Variable (la cible et le remplacement peuvent avoir des tailles diff\u00e9rentes)<\/td>\n<td>Fixe (chaque caract\u00e8re cibl\u00e9 est remplac\u00e9 par un caract\u00e8re correspondant)<\/td>\n<\/tr>\n<tr>\n<td><strong>Sensibilit\u00e9 \u00e0 la casse<\/strong><\/td>\n<td>Strictement sensible \u00e0 la casse par d\u00e9faut<\/td>\n<td>Strictement sensible \u00e0 la casse par d\u00e9faut<\/td>\n<\/tr>\n<tr>\n<td><strong>Ordre des arguments<\/strong><\/td>\n<td>(source, cible_originale, nouveau_remplacement)<\/td>\n<td>(source, nouveaux_caract\u00e8res, caract\u00e8res_originaux)<\/td>\n<\/tr>\n<tr>\n<td><strong>Cas d&rsquo;usage pr\u00e9f\u00e9rentiel<\/strong><\/td>\n<td>Harmonisation de nomenclatures, d&rsquo;acronymes ou de phrases<\/td>\n<td>Suppression d&rsquo;accents, substitution de d\u00e9limiteurs de ponctuation<\/td>\n<\/tr>\n<tr>\n<td><strong>Complexit\u00e9 computationnelle<\/strong><\/td>\n<td>Mod\u00e9r\u00e9e (balayage d&#8217;empreintes textuelles et d\u00e9calages)<\/td>\n<td>Extr\u00eamement faible (transposition de table d&rsquo;octets directe)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Le choix architectural entre ces deux commandes d\u00e9coule ainsi de la nature granulaire de la cible : d\u00e8s lors que le motif implique une relation ordonn\u00e9e de plusieurs lettres dont le sens d\u00e9pend de leur adjacence, TRANWRD est imp\u00e9rative ; d\u00e8s lors qu&rsquo;il s&rsquo;agit de nettoyer une classe de caract\u00e8res \u00e9pars sans consid\u00e9ration d&rsquo;ordre lexical, TRANSLATE s&rsquo;impose.<\/p>\n<h2>9. Utilisation avanc\u00e9e des expressions r\u00e9guli\u00e8res avec les fonctions PRX (PRXCHANGE)<\/h2>\n<h3>9.1 Limites inh\u00e9rentes \u00e0 TRANWRD face \u00e0 la complexit\u00e9 des motifs<\/h3>\n<p>En d\u00e9pit de sa remarquable simplicit\u00e9 et de son efficacit\u00e9 sur des motifs d\u00e9terministes, la fonction TRANWRD atteint rapidement ses limites structurelles face \u00e0 la variabilit\u00e9 inh\u00e9rente aux donn\u00e9es textuelles naturelles. En premier lieu, TRANWRD est incapable de g\u00e9rer les m\u00e9tacaract\u00e8res, les quantificateurs ou les conditions logiques alternatives. Il est impossible avec TRANWRD de d\u00e9finir un motif tel que \u00ab remplacer tout nombre comportant entre 3 et 5 chiffres suivi d&rsquo;une lettre majuscule \u00bb.<\/p>\n<p>De surcro\u00eet, la prise en charge des variantes morphologiques (telles que les formes plurielles, les accords de genre ou les pr\u00e9fixes alternatifs) exigerait avec TRANWRD une cascade d&rsquo;appels r\u00e9p\u00e9titifs d\u00e9gradant la lisibilit\u00e9 du code et la charge machine. Enfin, l&rsquo;incapacit\u00e9 de TRANWRD \u00e0 d\u00e9tecter nativement des fronti\u00e8res de mots (<em>word boundaries<\/em>) expose l&rsquo;analyste au risque permanent de substitutions collat\u00e9rales ind\u00e9sirables au sein de vocables plus longs contenant fortuitement la sous-cha\u00eene cibl\u00e9e.<\/p>\n<p>Pour franchir ce palier fonctionnel, le langage SAS int\u00e8gre le moteur de compilateur d&rsquo;expressions r\u00e9guli\u00e8res compatible Perl (Perl Regular Expressions, ou <strong>PRX<\/strong>), dont la fonction d&rsquo;interfa\u00e7age principale pour les substitutions textuelles est <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">PRXCHANGE<\/a>.<\/p>\n<h3>9.2 Syntaxe op\u00e9rationnelle de PRXCHANGE pour les substitutions complexes<\/h3>\n<p>La fonction PRXCHANGE adopte la notation classique de substitution de l&rsquo;\u00e9cosyst\u00e8me Perl, introduite par la lettre directive <code>s<\/code>, suivie d&rsquo;un d\u00e9limiteur (usuellement la barre oblique <code>\/<\/code>), du motif de recherche, du d\u00e9limiteur, de la cha\u00eene de substitution, d&rsquo;un ultime d\u00e9limiteur et de modificateurs d&rsquo;ex\u00e9cution optionnels. La syntaxe canonique s&rsquo;exprime ainsi :<\/p>\n<p><code>variable_resultat = prxchange('s\/motif_regex\/remplacement\/options', nombre_occurrences, source);<\/code><\/p>\n<p>Le param\u00e8tre <code>nombre_occurrences<\/code> sp\u00e9cifie le plafond d&rsquo;it\u00e9rations autoris\u00e9es au sein de la ligne (-1 indiquant que toutes les occurrences valides doivent \u00eatre substitu\u00e9es de mani\u00e8re exhaustive). L&rsquo;option d&rsquo;insensibilit\u00e9 \u00e0 la casse <code>i<\/code> (pour <em>case-insensitive<\/em>) r\u00e9sout instantan\u00e9ment la rigidit\u00e9 typographique de TRANWRD sans exiger la modification de la casse du texte original par UPCASE.<\/p>\n<p>Illustrons cette puissance avec un exemple m\u00e9dical : supposons qu&rsquo;une variable contienne des identifiants patients formalis\u00e9s sous des formats h\u00e9t\u00e9rog\u00e8nes (tels que \u00ab PAT-123 \u00bb, \u00ab Pat.456 \u00bb, ou \u00ab patient_789 \u00bb) et que l&rsquo;on d\u00e9sire unifier cette structure sous la d\u00e9signation standardis\u00e9e \u00ab ID-XXXX \u00bb :<\/p>\n<p><code>format_standard = prxchange('s\/pat(ient)?[._-](d+)\/ID-$2\/i', -1, id_brut);<\/code><\/p>\n<p>Gr\u00e2ce \u00e0 la capture par parenth\u00e8ses et aux r\u00e9f\u00e9rences arri\u00e8res (<em>backreferences<\/em> mat\u00e9rialis\u00e9es par <code>$2<\/code>), PRXCHANGE pr\u00e9serve dynamiquement la composante num\u00e9rique tout en normalisant le pr\u00e9fixe et le d\u00e9limiteur. Une telle prouesse algorithmique demeure totalement inaccessible \u00e0 la fonction TRANWRD.<\/p>\n<h3>9.3 Comparatif technique : Performances et lisibilit\u00e9 entre TRANWRD et PRXCHANGE<\/h3>\n<p>L&rsquo;arbitrage entre TRANWRD et PRXCHANGE soul\u00e8ve des consid\u00e9rations essentielles de rentabilit\u00e9 algorithmique et de maintenance logicielle \u00e0 long terme. Le moteur PRX repose sur une machine \u00e0 \u00e9tats finis non d\u00e9terministe (NFA) qui n\u00e9cessite la compilation du motif regex en m\u00e9moire (via la fonction PRXPARSE) avant d&rsquo;ex\u00e9cuter la phase d&rsquo;appariement. Cette machinerie algorithmique sophistiqu\u00e9e implique une surcharge computationnelle (<em>CPU overhead<\/em>) non n\u00e9gligeable.<\/p>\n<p>Dans un contexte o\u00f9 les donn\u00e9es volumineuses comptent des centaines de millions d&rsquo;enregistrements, l&rsquo;ex\u00e9cution d&rsquo;un motif PRX complexe peut \u00eatre de 3 \u00e0 8 fois plus lente que l&rsquo;ex\u00e9cution d&rsquo;un TRANWRD compil\u00e9 en langage C de bas niveau, si le motif de recherche est une cha\u00eene parfaitement fixe. Si le besoin de traitement se limite \u00e0 remplacer \u00ab SARL \u00bb par \u00ab SOCI\u00c9T\u00c9 \u00bb, l&#8217;emploi de PRXCHANGE rel\u00e8ve de la sur-ing\u00e9nierie pr\u00e9judiciable aux performances du cluster de calcul SAS.<\/p>\n<p>En mati\u00e8re de lisibilit\u00e9 et de maintenance, la syntaxe \u00e9pur\u00e9e de TRANWRD permet une reprise imm\u00e9diate du code par n&rsquo;importe quel biostatisticien ou data engineer sans pr\u00e9requis avanc\u00e9 en th\u00e9orie des langages formels, tandis que les expressions r\u00e9guli\u00e8res denses g\u00e9n\u00e8rent r\u00e9guli\u00e8rement des incompr\u00e9hensions ou des vuln\u00e9rabilit\u00e9s de parsing lors des r\u00e9visions de scripts.<\/p>\n<h2>10. Gestion de la m\u00e9moire, de la longueur des variables et troncature avec LENGTH<\/h2>\n<h3>10.1 Attribution implicite de la longueur par SAS lors de l&rsquo;usage de TRANWRD<\/h3>\n<p>L&rsquo;un des comportements les plus insidieux du langage SAS lors de l&rsquo;utilisation de fonctions de manipulation textuelle concerne l&rsquo;attribution automatique de la longueur des variables dans le vecteur PDV. Lorsqu&rsquo;une variable est cr\u00e9\u00e9e pour la premi\u00e8re fois dans une \u00e9tape DATA par le biais d&rsquo;une affectation directe impliquant la fonction TRANWRD, le compilateur doit figer sa dimension physique dans le dictionnaire de la table avant m\u00eame de lire la moindre ligne de donn\u00e9es.<\/p>\n<p>Si la variable source poss\u00e8de une longueur explicitement typ\u00e9e, SAS attribue g\u00e9n\u00e9ralement \u00e0 la nouvelle variable la longueur exacte de cette variable source, ou une limite conventionnelle de 200 octets si l&rsquo;expression fait intervenir des op\u00e9rations imbriqu\u00e9es non r\u00e9solues. Or, consid\u00e9rons un sc\u00e9nario o\u00f9 la variable source a une longueur dimensionn\u00e9e au plus juste \u00e0 15 octets pour contenir des cha\u00eenes telles que \u00ab Ville de Paris \u00bb.<\/p>\n<p>Si l&rsquo;on d\u00e9cide d&rsquo;utiliser TRANWRD pour substituer le mot \u00ab Ville \u00bb par \u00ab Agglom\u00e9ration Urbaine Pr\u00e9fectorale \u00bb, la nouvelle cha\u00eene n\u00e9cessiterait environ 40 octets pour s&rsquo;\u00e9panouir int\u00e9gralement. Mais la variable de r\u00e9ception ayant h\u00e9rit\u00e9 implicitement de la longueur originelle de 15 octets, SAS tronquera brutalement le r\u00e9sultat final au 15\u00e8me caract\u00e8re. Cette troncature s&rsquo;effectue souvent sans lever d&rsquo;erreur fatale susceptible d&rsquo;interrompre l&rsquo;\u00e9tape DATA, laissant les donn\u00e9es irr\u00e9m\u00e9diablement corrompues.<\/p>\n<h3>10.2 D\u00e9finition proactive de la longueur avec l&rsquo;instruction LENGTH<\/h3>\n<p>Pour \u00e9liminer d\u00e9finitivement ce danger syst\u00e9mique, le principe fondamental d&rsquo;ing\u00e9nierie logicielle sous SAS impose la d\u00e9claration explicite de la structure de donn\u00e9es en t\u00eate d&rsquo;\u00e9tape DATA. L&rsquo;instruction d\u00e9clarative <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">LENGTH<\/a> doit imp\u00e9rativement figurer avant la premi\u00e8re assignation logique de la variable r\u00e9ceptrice.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/replacesas3.jpg\" alt=\"\" \/><\/figure>\n<p>L&rsquo;impl\u00e9mentation rigoureuse adopte la forme suivante :<\/p>\n<p><code>data reporting_standard;<br \/>\n&nbsp;&nbsp;length libelle_complet $ 250;<br \/>\n&nbsp;&nbsp;set donnees_sources;<br \/>\n&nbsp;&nbsp;libelle_complet = tranwrd(libelle_court, 'Ctre Hosp', 'Centre Hospitalier Universitaire R\u00e9gional');<br \/>\nrun;<\/code><\/p>\n<p>En sp\u00e9cifiant <code>length libelle_complet $ 250;<\/code> avant l&rsquo;instruction SET ou l&rsquo;instruction d&rsquo;affectation, le d\u00e9veloppeur force l&rsquo;allocateur de m\u00e9moire du compilateur \u00e0 r\u00e9server un buffer de 250 octets dans le vecteur PDV. Ainsi, quelles que soient les extensions longitudinales provoqu\u00e9es par les substitutions textuelles de TRANWRD, aucune troncature ne viendra amputer la s\u00e9mantique de l&rsquo;enregistrement de sortie.<\/p>\n<h3>10.3 Optimisation des ressources de stockage dans les tables de production<\/h3>\n<p>Bien que la pr\u00e9caution de surdimensionner la longueur d&rsquo;une variable garantisse la pr\u00e9servation int\u00e9grale des donn\u00e9es contre la troncature, cette strat\u00e9gie peut se r\u00e9v\u00e9ler dispendieuse en termes d&rsquo;espace disque et de m\u00e9moire tampon d&rsquo;entr\u00e9es\/sorties (I\/O). Si une table de production contient cent millions d&rsquo;enregistrements et que l&rsquo;on alloue une variable de 200 octets alors que la cha\u00eene la plus longue n&rsquo;en occupera jamais plus de 50, des gigaoctets entiers d&rsquo;espaces de remplissage vides sont inutilement allou\u00e9s et transf\u00e9r\u00e9s \u00e0 travers le r\u00e9seau de stockage.<\/p>\n<p>Pour concilier int\u00e9grit\u00e9 et sobri\u00e9t\u00e9 mat\u00e9rielle, le programmeur averti proc\u00e8de en deux temps sur les grands jeux de donn\u00e9es. Lors de la phase de transformation initiale, une taille conservatrice est accord\u00e9e pour autoriser l&rsquo;expansion textuelle. Par la suite, une proc\u00e9dure d&rsquo;analyse dimensionnelle employant les fonctions <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">LENGTHC<\/a> (longueur d&rsquo;allocation totale) et <strong>LENGTHN<\/strong> (longueur r\u00e9elle ignorant les espaces de queue) permet d&rsquo;identifier la valeur maximale effectivement atteinte par la variable :<\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;select max(lengthn(libelle_complet)) as longueur_optimale<br \/>\n&nbsp;&nbsp;from reporting_standard;<br \/>\nquit;<\/code><\/p>\n<p>La valeur maximale identifi\u00e9e permet ensuite d&rsquo;ex\u00e9cuter une passe d&rsquo;optimisation via la proc\u00e9dure PROC DATASETS, redimensionnant au plus juste l&#8217;empreinte physique de la colonne sans recompiler l&rsquo;int\u00e9gralit\u00e9 du dataset, pr\u00e9servant ainsi \u00e0 la fois la bande passante I\/O et les co\u00fbts d&rsquo;infrastructure d&rsquo;h\u00e9bergement.<\/p>\n<h2>11. Traitement conditionnel et substitutions massives sur plusieurs colonnes<\/h2>\n<h3>11.1 Substitutions cibl\u00e9es sous conditions logiques (IF-THEN \/ WHERE)<\/h3>\n<p>Dans les pipelines de traitement de donn\u00e9es \u00e0 grande \u00e9chelle, appliquer syst\u00e9matiquement la fonction TRANWRD sur chaque ligne et chaque observation peut induire une d\u00e9pense inutile de cycles d&rsquo;horloge du processeur. Lorsqu&rsquo;un motif de recherche n&rsquo;est pr\u00e9sent que dans une sous-population statistiquement rare de la table, il est particuli\u00e8rement judicieux d&rsquo;adjoindre un filtre logique conditionnel \u00e0 l&rsquo;op\u00e9ration de substitution.<\/p>\n<p>Cette approche tire parti de la fonction <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">INDEX<\/a> ou <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0u1f42sz2scmin12m8hsvj3a2ec.htm\">FIND<\/a> au sein d&rsquo;une structure conditionnelle IF-THEN :<\/p>\n<p><code>if find(diagnostic, 'DIAB') &gt; 0 then do;<br \/>\n&nbsp;&nbsp;diagnostic_std = tranwrd(diagnostic, 'DIAB', 'Diab\u00e8te de Type');<br \/>\nend;<br \/>\nelse do;<br \/>\n&nbsp;&nbsp;diagnostic_std = diagnostic;<br \/>\nend;<\/code><\/p>\n<p>La fonction FIND v\u00e9rifie rapidement l&rsquo;existence du sous-motif via un algorithme de recherche rapide de type Boyer-Moore. Si l&#8217;empreinte n&rsquo;est pas d\u00e9tect\u00e9e (retour d&rsquo;indice 0), le bloc DO de TRANWRD est enti\u00e8rement ignor\u00e9, \u00e9pargnant au syst\u00e8me le cycle d&rsquo;allocation dynamique et de reconstruction de cha\u00eene. Sur un ensemble de donn\u00e9es m\u00e9dicales h\u00e9t\u00e9rog\u00e8ne de plusieurs dizaines de millions de lignes, cette conditionalisation peut r\u00e9duire le temps d&rsquo;ex\u00e9cution global de mani\u00e8re significative.<\/p>\n<h3>11.2 Automatisation des remplacements \u00e0 l&rsquo;aide de tableaux (ARRAYS)<\/h3>\n<p>Les tables SAS du secteur biom\u00e9dical ou financier comportent fr\u00e9quemment une collection \u00e9tal\u00e9e de colonnes textuelles analogues, telles que des variables de questionnaires r\u00e9p\u00e9t\u00e9es (ex : <code>symptome_1<\/code>, <code>symptome_2<\/code>, &#8230;, <code>symptome_20<\/code>). R\u00e9p\u00e9ter manuellement vingt assignations TRANWRD successives au sein de l&rsquo;\u00e9tape DATA nuit \u00e0 l&rsquo;\u00e9l\u00e9gance de la base de code, viole le principe de modularit\u00e9 DRY (<em>Don&rsquo;t Repeat Yourself<\/em>) et multiplie les risques de coquilles d&rsquo;assignation.<\/p>\n<p>L&rsquo;utilisation des tableaux vectoriels SAS (<strong>ARRAY<\/strong>) offre une r\u00e9ponse architecturale \u00e0 cette contrainte. En encapsulant l&rsquo;ensemble des colonnes d&rsquo;int\u00e9r\u00eat au sein d&rsquo;une structure indic\u00e9e \u00e9ph\u00e9m\u00e8re, le d\u00e9veloppeur peut it\u00e9rer sur l&rsquo;ensemble des champs textuels au moyen d&rsquo;une boucle it\u00e9rative s\u00e9quentielle <code>DO OVER<\/code> ou <code>DO i = 1 TO dim()<\/code> :<\/p>\n<p><code>data harmonisation_enquetes;<br \/>\n&nbsp;&nbsp;set questionnaire_brut;<br \/>\n&nbsp;&nbsp;array questions{*} qtext_1 - qtext_20;<br \/>\n&nbsp;&nbsp;do i = 1 to dim(questions);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;questions{i} = tranwrd(questions{i}, 'N\/A', 'Non Applicable');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;questions{i} = strip(compbl(questions{i}));<br \/>\n&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;drop i;<br \/>\nrun;<\/code><\/p>\n<p>Cette approche permet d&rsquo;appliquer une batterie compl\u00e8te de r\u00e8gles de nettoyage textuel et de normalisation spatiale sur des dizaines de colonnes de mani\u00e8re homog\u00e8ne et hautement condens\u00e9e, assurant la coh\u00e9rence transversale du dictionnaire de donn\u00e9es en aval.<\/p>\n<h3>11.3 \u00c9criture de macro-programmes SAS pour la substitution param\u00e9trique<\/h3>\n<p>Pour garantir la portabilit\u00e9 des routines de nettoyage au sein de pipelines de donn\u00e9es institutionnels complexes, il est recommand\u00e9 d&rsquo;encapsuler la logique de substitution au sein du langage macro de SAS. La compilation d&rsquo;une macro-commande r\u00e9utilisable autorise l&rsquo;injection dynamique des noms de tables, des variables cibles et des couples de valeurs de substitution sans r\u00e9\u00e9criture du code source DATA :<\/p>\n<p><code>%macro substituer_lexique(table_in=, table_out=, var_texte=, cible=, remplacement=);<br \/>\n&nbsp;&nbsp;data &amp;table_out;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;length &amp;var_texte._nettoyee $ 200;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set &amp;table_in;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;var_texte._nettoyee = tranwrd(&amp;var_texte, \"&amp;cible\", \"&amp;remplacement\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;var_texte._nettoyee = strip(compbl(&amp;var_texte._nettoyee));<br \/>\n&nbsp;&nbsp;run;<br \/>\n%mend substituer_lexique;<\/code><\/p>\n<p>L&rsquo;appel unifi\u00e9 de cette routine standardis\u00e9e s&rsquo;op\u00e8re par une simple instruction param\u00e9trique :<\/p>\n<p><code>%substituer_lexique(table_in=clinique_data, table_out=clinique_clean, var_texte=statut_visite, cible=ANNUL, remplacement=Annulation Valid\u00e9e);<\/code><\/p>\n<p>L&rsquo;automatisation macro permet d&rsquo;int\u00e9grer des validations de param\u00e8tres complexes, de g\u00e9rer des dictionnaires externes de m\u00e9tadonn\u00e9es et de standardiser les processus de gouvernance de donn\u00e9es \u00e0 travers des d\u00e9partements analytiques entiers.<\/p>\n<h2>12. Synth\u00e8se m\u00e9thodologique, diagnostics d&rsquo;erreurs et meilleures pratiques en SAS<\/h2>\n<h3>12.1 Diagnostics des erreurs fr\u00e9quentes et interpr\u00e9tation du journal SAS (SAS Log)<\/h3>\n<p>La phase de d\u00e9bogage constitue une dimension ins\u00e9parable du cycle de vie du d\u00e9veloppement sous SAS. Le journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>) contient des indices diagnostiques pr\u00e9cieux qu&rsquo;il convient de savoir interpr\u00e9ter face \u00e0 des comportements inattendus de la fonction TRANWRD. L&rsquo;une des erreurs les plus fr\u00e9quentes survient lorsqu&rsquo;un argument fourni \u00e0 la fonction est d&rsquo;un type num\u00e9rique alors qu&rsquo;une cha\u00eene \u00e9tait attendue.<\/p>\n<p>Dans ce sc\u00e9nario, le compilateur SAS n&rsquo;interrompt pas brutalement l&rsquo;ex\u00e9cution de l&rsquo;\u00e9tape DATA, mais applique une conversion implicite d&rsquo;attribut en ins\u00e9rant une note d&rsquo;avertissement caract\u00e9ristique dans le journal :<\/p>\n<p><em>NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).<\/em><\/p>\n<p>Cette conversion implicite convertit le nombre en une cha\u00eene cadr\u00e9e \u00e0 droite d&rsquo;une longueur par d\u00e9faut de 12 caract\u00e8res, g\u00e9n\u00e9rant des espaces initiaux inattendus qui emp\u00eachent toute correspondance avec le motif cible. La r\u00e9solution impose de recourir formellement \u00e0 la fonction <code>PUT(variable, format.)<\/code> pour ma\u00eetriser explicitement la forme textuelle inject\u00e9e dans TRANWRD.<\/p>\n<p>Un deuxi\u00e8me point de vigilance concerne la gestion des encodages de caract\u00e8res (ex : UTF-8 versus WLATIN1). Lorsqu&rsquo;une session SAS configur\u00e9e en UTF-8 traite des donn\u00e9es textuelles accentu\u00e9es, un caract\u00e8re accentu\u00e9 tel que \u00ab \u00e9 \u00bb occupe deux octets physiques et non un seul. Si une cha\u00eene est d\u00e9coup\u00e9e ou substitu\u00e9e par des routines inappropri\u00e9es, des octets de continuation peuvent \u00eatre bris\u00e9s, g\u00e9n\u00e9rant des corruptions d&rsquo;encodage (symbolis\u00e9es par des glyphes de remplacement ou des erreurs de troncature multi-octets dans la session). Le d\u00e9veloppeur doit s&rsquo;assurer que la longueur d\u00e9clar\u00e9e via LENGTH int\u00e8gre une marge suffisante pour les octets multi-octets propres aux environnements Unicode contemporains.<\/p>\n<h3>12.2 Matrice de validation et protocole de test post-transformation<\/h3>\n<p>La validation empirique d&rsquo;un processus de substitution textuelle ne saurait se limiter \u00e0 l&rsquo;inspection al\u00e9atoire de quelques lignes via PROC PRINT. L&rsquo;adoption d&rsquo;un protocole de validation statistique rigoureux s&rsquo;impose avant tout d\u00e9ploiement en production. La proc\u00e9dure de r\u00e9f\u00e9rence pour contr\u00f4ler l&rsquo;int\u00e9grit\u00e9 de la transformation est la proc\u00e9dure <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/p12n19z7k7omcon18h4sbf9t2576.htm\">PROC FREQ<\/a> ex\u00e9cut\u00e9e en table crois\u00e9e sur les variables avant et apr\u00e8s traitement :<\/p>\n<p><code>proc freq data=new_teams_data;<br \/>\n&nbsp;&nbsp;tables team * new_team \/ list missing;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;affichage sous forme de liste unifi\u00e9e (<code>\/ list<\/code>) permet d&rsquo;inspecter l&rsquo;exhaustivit\u00e9 des correspondances bijectives cr\u00e9\u00e9es par l&rsquo;algorithme. Tout enregistrement o\u00f9 la variable modifi\u00e9e afficherait une valeur vide, une anomalie typographique ou une absence de concordance attendue appara\u00eet imm\u00e9diatement avec sa fr\u00e9quence exacte d&rsquo;occurrence au sein de la table globale.<\/p>\n<p>En parall\u00e8le, l&rsquo;extraction d\u00e9di\u00e9e des lignes suspectes au moyen d&rsquo;une clause WHERE dans une proc\u00e9dure PROC PRINT permet de capturer les valeurs aberrantes r\u00e9siduelles pour analyse approfondie :<\/p>\n<p><code>proc print data=new_teams_data;<br \/>\n&nbsp;&nbsp;where find(new_team, 'Wild') &gt; 0 or new_team = ' ';<br \/>\n&nbsp;&nbsp;title 'D\u00e9tection des D\u00e9faillances de Remplacement ou Valeurs Vides';<br \/>\nrun;<\/code><\/p>\n<p>Ce double filtre analytique garantit une auditabilit\u00e9 int\u00e9grale du pipeline de nettoyage textuel avant transmission aux \u00e9quipes d&rsquo;analyse statistique ou de biostatistique d\u00e9cisionnelle.<\/p>\n<h3>12.3 Recommandations formelles et arbre d\u00e9cisionnel pour les op\u00e9rations de substitution<\/h3>\n<p>Pour p\u00e9renniser la qualit\u00e9 logicielle et la lisibilit\u00e9 des programmes d\u00e9velopp\u00e9s au sein des d\u00e9partements analytiques, une synth\u00e8se des meilleures pratiques peut \u00eatre formalis\u00e9e sous la forme d&rsquo;un arbre d\u00e9cisionnel d&rsquo;impl\u00e9mentation :<\/p>\n<ul>\n<li><strong>R\u00e8gle 1 : Typologie de la substitution.<\/strong> Si l&rsquo;op\u00e9ration consiste \u00e0 convertir un jeu de caract\u00e8res \u00e9pars un \u00e0 un (ex : transposition d&rsquo;accents ou neutralisation de caract\u00e8res sp\u00e9ciaux de ponctuation), employer imp\u00e9rativement <strong>TRANSLATE<\/strong>.<\/li>\n<li><strong>R\u00e8gle 2 : Substitutions de motifs d\u00e9terministes.<\/strong> Si l&rsquo;op\u00e9ration cible un mot pr\u00e9cis, un acronyme ou une locution continue fixe, employer syst\u00e9matiquement <strong>TRANWRD<\/strong> coupl\u00e9e \u00e0 <strong>STRIP<\/strong> et <strong>COMPBL<\/strong> pour assainir l&rsquo;espace typographique r\u00e9siduel.<\/li>\n<li><strong>R\u00e8gle 3 : Motifs polymorphiques ou bas\u00e9s sur des r\u00e8gles syntaxiques complexes.<\/strong> Si la d\u00e9tection du motif d\u00e9pend de masques num\u00e9riques, de jokers ou de m\u00e9tacaract\u00e8res dynamiques, recourir aux fonctions d&rsquo;expressions r\u00e9guli\u00e8res <strong>PRXCHANGE<\/strong>.<\/li>\n<li><strong>R\u00e8gle 4 : Pr\u00e9vention de la troncature.<\/strong> D\u00e9clarer syst\u00e9matiquement la longueur maximale requise pour la variable r\u00e9ceptrice via une instruction <strong>LENGTH<\/strong> plac\u00e9e en t\u00eate de l&rsquo;\u00e9tape DATA, en pr\u00e9voyant une marge suffisante pour les environnements de codage UTF-8.<\/li>\n<li><strong>R\u00e8gle 5 : Pr\u00e9servation de l&rsquo;historique brut.<\/strong> Ne jamais r\u00e9\u00e9crire sur la colonne d&rsquo;origine dans les tables de premier niveau ; cr\u00e9er syst\u00e9matiquement une nouvelle variable d\u00e9riv\u00e9e explicitement document\u00e9e.<\/li>\n<\/ul>\n<p>En observant scrupuleusement ces directives m\u00e9thodologiques, les analystes de donn\u00e9es, biostatisticiens et ing\u00e9nieurs logiciels s&rsquo;assurent de produire un code SAS hautement performant, p\u00e9renne, conforme aux exigences de validation des agences de r\u00e9gulation internationales et garantissant une int\u00e9grit\u00e9 absolue des donn\u00e9es textuelles trait\u00e9es.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS<\/em> (3rd ed.). SAS Institute Inc. https:\/\/support.sas.com\/en\/books.html<\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc. https:\/\/www.sas.com\/store\/books\/categories\/usage-and-reference\/the-little-sas-book-a-primer-sixth-edition\/prodBK_69044_en.html<\/li>\n<li>Horstman, D. W. (2017). <em>Manipulating Data with SAS Functions: A Step-by-Step Guide<\/em>. SAS Institute Inc. https:\/\/support.sas.com\/resources\/papers\/proceedings17\/0458-2017.pdf<\/li>\n<li>SAS Institute Inc. (2021). <em>SAS(R) 9.4 Functions and CALL Routines: Reference, Fifth Edition<\/em>. SAS Documentation. https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/titlepage.htm<\/li>\n<li>SAS Institute Inc. (2023). <em>Character String Functions in the SAS Data Step<\/em>. SAS Technical Papers. https:\/\/support.sas.com\/resources\/papers\/<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet sur le remplacement de caract\u00e8res et de sous-cha\u00eenes dans SAS via TRANWRD, TRANSLATE et PRXCHANGE, avec exemples et syntaxe.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[9499,11274],"tags":[11276,10195,3002,235,11275],"class_list":["post-9864","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-sas","category-traitement-des-donnees","tag-chaines-de-caracteres","tag-etape-data","tag-nettoyage-de-donnees","tag-sas","tag-tranwrd"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9864"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9864\/revisions"}],"predecessor-version":[{"id":9868,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9864\/revisions\/9868"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}