{"id":9310,"date":"2026-10-14T18:02:29","date_gmt":"2026-10-14T18:02:29","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/sas-filtrer-lignes-contenant-chaine\/"},"modified":"2026-10-14T18:02:29","modified_gmt":"2026-10-14T18:02:29","slug":"sas-filtrer-lignes-contenant-chaine","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=sas-filtrer-lignes-contenant-chaine","title":{"rendered":"SAS : Filtrer les lignes contenant une cha\u00eene"},"content":{"rendered":"<p>Le traitement des donn\u00e9es textuelles au sein de l&rsquo;environnement d&rsquo;analyse statistique SAS (Statistical Analysis System) constitue un axe fondamental de la pr\u00e9paration, du nettoyage et de la mod\u00e9lisation empirique des donn\u00e9es quantitatives et qualitatives. Alors que les jeux de donn\u00e9es modernes s&rsquo;enrichissent continuellement de variables alphanum\u00e9riques non structur\u00e9es ou semi-structur\u00e9es \u2014 allant des identifiants alphanum\u00e9riques complexes aux dossiers m\u00e9dicaux \u00e9lectroniques, en passant par les verbatims d&rsquo;enqu\u00eates psychosociales \u2014, la capacit\u00e9 d&rsquo;isoler avec exactitude les enregistrements r\u00e9pondant \u00e0 des crit\u00e8res textuels sp\u00e9cifiques repr\u00e9sente une comp\u00e9tence m\u00e9thodologique essentielle pour le statisticien, l&rsquo;\u00e9pid\u00e9miologiste et le scientifique des donn\u00e9es.<\/p>\n<p>Le filtrage de lignes sur la base de la pr\u00e9sence d&rsquo;une sous-cha\u00eene requiert une compr\u00e9hension aigu\u00eb des m\u00e9canismes internes de SAS. L&rsquo;architecture de ce syst\u00e8me de traitement repose sur une distinction stricte entre les \u00e9tapes de compilation et d&rsquo;ex\u00e9cution, la gestion de vecteurs de m\u00e9moire d\u00e9di\u00e9s et la mise en \u0153uvre de moteurs d&rsquo;entr\u00e9es\/sorties optimis\u00e9s. Choisir la technique appropri\u00e9e pour filtrer une cha\u00eene de caract\u00e8res ne rel\u00e8ve pas d&rsquo;une simple pr\u00e9f\u00e9rence stylistique ; ce choix conditionne directement la validit\u00e9 scientifique des sous-populations extraites, l&rsquo;efficience algorithmique des requ\u00eates et la consommation des ressources de calcul lors de l&rsquo;exploitation de volum\u00e9tries massives.<\/p>\n<p>Cette analyse exhaustive a pour vocation d&rsquo;explorer l&rsquo;int\u00e9gralit\u00e9 des paradigmes, op\u00e9rateurs et fonctions d\u00e9di\u00e9s au filtrage textuel sous SAS. \u00c0 travers l&rsquo;\u00e9tude de l&rsquo;op\u00e9rateur historique <strong>CONTAINS<\/strong>, des pr\u00e9dicats relationnels discrets, des fonctions de recherche scalaire natives telles que <strong>INDEX<\/strong>, <strong>FIND<\/strong> et <strong>FINDW<\/strong>, ainsi que des expressions r\u00e9guli\u00e8res avanc\u00e9es (moteur Perl Regular Expressions), ce guide propose une grille de lecture technique et appliqu\u00e9e. Chaque approche sera examin\u00e9e \u00e0 la lumi\u00e8re de ses fondements th\u00e9oriques, de ses implications computationnelles sur le vecteur de m\u00e9moire tampon (Program Data Vector) et de sa robustesse face aux ambigu\u00eft\u00e9s textuelles r\u00e9elles.<\/p>\n<h2>1. Introduction aux m\u00e9canismes de s\u00e9lection textuelle sous SAS<\/h2>\n<h3>1.1 Importance du filtrage textuel dans l&rsquo;analyse de donn\u00e9es<\/h3>\n<p>Dans l&rsquo;\u00e9cosyst\u00e8me de la recherche empirique et de l&rsquo;ing\u00e9nierie d\u00e9cisionnelle, les donn\u00e9es textuelles occupent une place paradoxale. Bien que les mod\u00e8les pr\u00e9dictifs et inf\u00e9rentiels reposent majoritairement sur des m\u00e9triques num\u00e9riques, la phase d&rsquo;inclusion, d&rsquo;exclusion et de stratification des cohortes repose presque syst\u00e9matiquement sur des m\u00e9tadonn\u00e9es alphanum\u00e9riques. Dans ce contexte, la s\u00e9lection de sous-ensembles de donn\u00e9es \u00e0 partir de crit\u00e8res textuels s&rsquo;\u00e9rige en garant de la validit\u00e9 interne des protocoles d&rsquo;investigation. Une erreur dans la formulation d&rsquo;un filtre textuel peut introduire des biais de s\u00e9lection syst\u00e9matiques, compromettant l&rsquo;int\u00e9grit\u00e9 des inf\u00e9rences causales ou la fiabilit\u00e9 des indicateurs macro\u00e9conomiques d\u00e9riv\u00e9s.<\/p>\n<p>Au sein de l&rsquo;architecture SAS, les variables de type caract\u00e8re se caract\u00e9risent par une allocation de m\u00e9moire \u00e0 longueur fixe, d\u00e9finie par d\u00e9faut ou explicitement via l&rsquo;instruction <strong>LENGTH<\/strong>. Contrairement aux environnements contemporains g\u00e9rant des cha\u00eenes dynamiques \u00e0 terminaison nulle (comme le langage C ou Python), SAS assigne un espace contigu d&rsquo;octets compl\u00e9t\u00e9 par des espaces de remplissage (trailing blanks). Cette particularit\u00e9 structurelle engendre une complexit\u00e9 intrins\u00e8que : la recherche d&rsquo;une s\u00e9quence sp\u00e9cifique doit imp\u00e9rativement distinguer le contenu s\u00e9mantique effectif du rembourrage spatial sous-jacent. De surcro\u00eet, la nature h\u00e9t\u00e9rog\u00e8ne des donn\u00e9es semi-structur\u00e9es \u2014 sources textuelles issues d&rsquo;interfaces de saisie libre ou de flux d&rsquo;ingestion multicanaux \u2014 confronte le praticien \u00e0 des anomalies typographiques, des discordances de casse et des variations orthographiques impr\u00e9visibles.<\/p>\n<p>L&rsquo;impact de la pr\u00e9cision du filtrage d\u00e9passe la simple conformit\u00e9 syntaxique. Lors de l&rsquo;analyse de bases de donn\u00e9es m\u00e9dico-administratives \u00e0 grande \u00e9chelle, telles que le Syst\u00e8me National des Donn\u00e9es de Sant\u00e9 (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.snds.gouv.fr\">SNDS<\/a>), la s\u00e9lection erron\u00e9e ou l&rsquo;omission d&rsquo;une sous-cha\u00eene d\u00e9signant un diagnostic nosologique peut alt\u00e9rer l&rsquo;estimation de l&rsquo;incidence d&rsquo;une pathologie. La ma\u00eetrise des m\u00e9canismes de d\u00e9tection de sous-cha\u00eenes devient alors un imp\u00e9ratif de rigueur m\u00e9thodologique, assurant une parfaite concordance entre les d\u00e9finitions op\u00e9rationnelles de l&rsquo;\u00e9tude et les observations effectivement retenues pour l&rsquo;estimation statistique.<\/p>\n<h3>1.2 Vue d&rsquo;ensemble des architectures de filtrage : \u00e9tape DATA versus proc\u00e9dures<\/h3>\n<p>L&rsquo;environnement SAS offre deux architectures conceptuellement distinctes pour restreindre le traitement d&rsquo;une table aux lignes satisfaisant une condition textuelle : l&rsquo;\u00e9valuation en amont via l&rsquo;instruction <strong>WHERE<\/strong> et le sous-ensemble conditionnel s\u00e9quentiel assur\u00e9 par l&rsquo;instruction <strong>IF<\/strong> au sein de l&rsquo;\u00e9tape DATA. Comprendre la fronti\u00e8re op\u00e9rationnelle entre ces deux modes op\u00e9ratoires n\u00e9cessite de diss\u00e9quer le flux de donn\u00e9es transitant entre le support de stockage physique et le processeur.<\/p>\n<p>L&rsquo;instruction <strong>WHERE<\/strong> op\u00e8re directement au niveau du moteur d&rsquo;acc\u00e8s aux donn\u00e9es (l&rsquo;Input Engine). Lorsqu&rsquo;une clause <strong>WHERE<\/strong> est soumise, le moteur SAS \u00e9value le pr\u00e9dicat logique avant m\u00eame que l&rsquo;enregistrement ne soit transf\u00e9r\u00e9 dans la structure de m\u00e9moire centrale appel\u00e9e Program Data Vector (PDV). Si l&rsquo;enregistrement ne contient pas la cha\u00eene de caract\u00e8res recherch\u00e9e, il est purement et simplement \u00e9cart\u00e9 du flux de lecture. Cette m\u00e9canique minimise drastiquement les op\u00e9rations d&rsquo;entr\u00e9es\/sorties (I\/O) et dispense le syst\u00e8me d&rsquo;allouer des cycles d&rsquo;horloge \u00e0 l&rsquo;initialisation du PDV pour les lignes non pertinentes. En outre, la syntaxe <strong>WHERE<\/strong> pr\u00e9sente l&rsquo;avantage unique d&rsquo;\u00eatre universellement reconnue au sein des proc\u00e9dures d&rsquo;analyse (notamment PROC PRINT, PROC FREQ ou PROC SQL), autorisant un filtrage \u00e0 la vol\u00e9e sans g\u00e9n\u00e9ration de table interm\u00e9diaire.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;instruction conditionnelle <strong>IF<\/strong> (utilis\u00e9e sous sa forme de sous-ensemble : <em>IF condition;<\/em>) intervient strictement au sein de l&rsquo;\u00e9tape DATA, en aval du chargement de l&rsquo;observation dans le Program Data Vector. Chaque observation est d&rsquo;abord lue depuis le disque ou la m\u00e9moire tampon, les variables y sont instanci\u00e9es, puis la logique s\u00e9quentielle du programme \u00e9value le pr\u00e9dicat. Si la condition textuelle est fausse, le traitement de l&rsquo;it\u00e9ration courante s&rsquo;interrompt et le pointeur passe \u00e0 l&rsquo;observation suivante sans \u00e9crire dans la table de destination. Si cette approche s&rsquo;av\u00e8re indispensable lorsque le crit\u00e8re de filtrage d\u00e9pend d&rsquo;une variable calcul\u00e9e dynamiquement au cours de l&rsquo;\u00e9tape DATA, elle s&rsquo;av\u00e8re computationnellement sous-optimale pour filtrer des donn\u00e9es brutes pr\u00e9existantes sur des volumes volumineux.<\/p>\n<h2>2. Fondements syntaxiques de l&rsquo;op\u00e9rateur CONTAINS dans l&rsquo;instruction WHERE<\/h2>\n<h3>2.1 Syntaxe fondamentale et s\u00e9mantique de l&rsquo;op\u00e9rateur CONTAINS<\/h3>\n<p>L&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> constitue le standard historique et idiomatique du langage SAS pour v\u00e9rifier si une s\u00e9quence sp\u00e9cifique de caract\u00e8res est incluse au sein d&rsquo;une variable de type caract\u00e8re. Con\u00e7u sp\u00e9cifiquement pour \u00eatre int\u00e9gr\u00e9 aux expressions de filtrage de la clause <strong>WHERE<\/strong>, cet op\u00e9rateur relationnel \u00e9value l&rsquo;appartenance d&rsquo;une cha\u00eene cible \u00e0 un champ textuel donn\u00e9, sans exiger que ladite cha\u00eene occupe une position ordinale d\u00e9termin\u00e9e. Du point de vue de la formalisation syntaxique, l&rsquo;instruction adopte la structure g\u00e9n\u00e9rale : <em>WHERE variable CONTAINS &lsquo;cha\u00eene_recherch\u00e9e&rsquo;;<\/em>. SAS met \u00e9galement \u00e0 disposition un \u00e9quivalent mn\u00e9monique direct, repr\u00e9sent\u00e9 par le point d&rsquo;interrogation (<em>?<\/em>), de sorte que la formulation <em>WHERE variable ? &lsquo;cha\u00eene_recherch\u00e9e&rsquo;;<\/em> produit une action rigoureusement identique.<\/p>\n<p>Le fonctionnement interne de <strong>CONTAINS<\/strong> repose sur un balayage contigu des octets constituant la variable cible. D\u00e8s lors que la s\u00e9quence exacte sp\u00e9cifi\u00e9e entre guillemets est localis\u00e9e dans l&rsquo;enregistrement, l&rsquo;expression retourne la valeur logique VRAI, et l&rsquo;observation est retenue pour le traitement subs\u00e9quent. Il est primordial de souligner que cet op\u00e9rateur ne requiert aucun caract\u00e8re g\u00e9n\u00e9rique (wildcard) pour d\u00e9signer les positions p\u00e9riph\u00e9riques : la simple d\u00e9signation du fragment textuel suffit \u00e0 d\u00e9clencher la d\u00e9tection d&rsquo;inclusion.<\/p>\n<p>Consid\u00e9rons, \u00e0 titre d&rsquo;illustration m\u00e9thodologique, une recherche en psychom\u00e9trie clinique portant sur l&rsquo;analyse des profils d&rsquo;anxi\u00e9t\u00e9. Soit un jeu de donn\u00e9es contenant une variable descriptive nomm\u00e9e <em>Diagnostic_Libelle<\/em>. Afin d&rsquo;isoler l&rsquo;ensemble des patients pr\u00e9sentant une manifestation document\u00e9e d&rsquo;anxi\u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9e au sein d&rsquo;un libell\u00e9 complexe, la clause s&rsquo;articulera ainsi :<\/p>\n<p><em>DATA Cohorte_Anxiete; SET Enquete_Clinique; WHERE Diagnostic_Libelle CONTAINS &lsquo;Anxiete&rsquo;; RUN;<\/em><\/p>\n<p>Dans ce sc\u00e9nario, toute observation dont la variable <em>Diagnostic_Libelle<\/em> contient la suite exacte de sept caract\u00e8res \u00ab Anxiete \u00bb \u2014 que cette s\u00e9quence d\u00e9bute la cha\u00eene, apparaisse au milieu d&rsquo;une phrase explicative ou termine la description \u2014 sera s\u00e9lectionn\u00e9e avec succ\u00e8s et transmise vers la nouvelle table d&rsquo;analyse.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/contains1.jpg\" alt=\"\" \/><\/figure>\n<h3>2.2 Sensibilit\u00e9 \u00e0 la casse et contraintes de concordance exacte<\/h3>\n<p>Un des pi\u00e8ges majeurs inh\u00e9rents \u00e0 l&rsquo;usage de l&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> r\u00e9side dans sa stricte sensibilit\u00e9 \u00e0 la casse (case sensitivity). Dans les syst\u00e8mes d&rsquo;encodage de caract\u00e8res standards (qu&rsquo;il s&rsquo;agisse de configurations ASCII, UTF-8 ou EBCDIC historiques), chaque glyphe poss\u00e8de un point de code binaire distinct selon qu&rsquo;il est repr\u00e9sent\u00e9 en majuscule ou en minuscule. Par cons\u00e9quent, l&rsquo;instruction <strong>CONTAINS<\/strong> effectue une comparaison binaire rigoureuse, octet par octet. Si une base de donn\u00e9es contient des variations orthotypographiques telles que \u00ab ANXIETE \u00bb, \u00ab Anxiete \u00bb ou \u00ab anxiete \u00bb, une clause formul\u00e9e avec la cha\u00eene litt\u00e9rale &lsquo;Anxiete&rsquo; omettra syst\u00e9matiquement tous les enregistrements ne respectant pas scrupuleusement cette r\u00e9partition des casses.<\/p>\n<p>Cette sensibilit\u00e9 stricte g\u00e9n\u00e8re un risque \u00e9lev\u00e9 d&rsquo;erreurs de type II (faux n\u00e9gatifs), o\u00f9 des observations pertinentes pour l&rsquo;analyse scientifique sont exclues de l&rsquo;\u00e9chantillon d&rsquo;\u00e9tude sans qu&rsquo;aucun message d&rsquo;erreur ou d&rsquo;avertissement ne soit \u00e9mis dans le journal d&rsquo;ex\u00e9cution (SAS Log). Les syst\u00e8mes de saisie en milieu hospitalier ou les formulaires web sans contr\u00f4le d&rsquo;int\u00e9grit\u00e9 typographique constituent des sources notoires de cette variabilit\u00e9.<\/p>\n<p>Pour immuniser le filtrage contre ce biais, la pratique recommand\u00e9e consiste \u00e0 combiner l&rsquo;op\u00e9rateur avec des fonctions de transformation de casse directement encapsul\u00e9es dans la clause de filtrage. En appliquant la fonction <strong>UPCASE<\/strong> ou <strong>LOWCASE<\/strong> \u00e0 la variable cible, le chercheur uniformise artificiellement la cha\u00eene avant son \u00e9valuation par l&rsquo;op\u00e9rateur :<\/p>\n<p><em>WHERE UPCASE(Diagnostic_Libelle) CONTAINS &lsquo;ANXIETE&rsquo;;<\/em><\/p>\n<p>Dans cette configuration, la totalit\u00e9 de la cha\u00eene <em>Diagnostic_Libelle<\/em> est transitoirement convertie en majuscules dans le moteur d&rsquo;\u00e9valuation, garantissant qu&rsquo;aucune occurrence ne sera ignor\u00e9e en raison d&rsquo;une disparit\u00e9 de casse. Il demeure essentiel de s&rsquo;assurer que la cha\u00eene de r\u00e9f\u00e9rence (ici &lsquo;ANXIETE&rsquo;) soit elle-m\u00eame enti\u00e8rement transcrite dans la casse adopt\u00e9e par la fonction de normalisation, sous peine de produire une condition universellement fausse qui viderait l&rsquo;\u00e9chantillon de toute donn\u00e9e.<\/p>\n<h3>2.3 \u00c9valuation logique et n\u00e9gation avec NOT CONTAINS<\/h3>\n<p>La logique bool\u00e9enne r\u00e9gissant les clauses de s\u00e9lection SAS autorise l&rsquo;inversion s\u00e9mantique compl\u00e8te d&rsquo;un pr\u00e9dicat par l&rsquo;adjonction de l&rsquo;op\u00e9rateur unaire <strong>NOT<\/strong>. L&rsquo;association logico-syntaxique <strong>NOT CONTAINS<\/strong> (ou son \u00e9quivalent contract\u00e9 <em>NOT ?<\/em>) permet d&rsquo;op\u00e9rer un filtrage soustractif, en \u00e9liminant syst\u00e9matiquement du flux d&rsquo;analyse tout enregistrement abritant une s\u00e9quence textuelle proscrite. Ce m\u00e9canisme s&rsquo;av\u00e8re particuli\u00e8rement f\u00e9cond lors des protocoles d&rsquo;\u00e9puration de donn\u00e9es, o\u00f9 il convient de purger un fichier d&rsquo;observations tests, de libell\u00e9s d&rsquo;erreurs techniques ou de statuts d&rsquo;invalidation administrative.<\/p>\n<p>Sur le plan de l&rsquo;alg\u00e8bre relationnelle, la n\u00e9gation d&rsquo;une condition d&rsquo;inclusion s&rsquo;exprime de la mani\u00e8re suivante :<\/p>\n<p><em>WHERE Diagnostic_Libelle NOT CONTAINS &lsquo;Invalide&rsquo;;<\/em><\/p>\n<p>Dans un contexte d&rsquo;analyse multidimensionnelle, l&#8217;emploi de <strong>NOT CONTAINS<\/strong> interagit fr\u00e9quemment avec d&rsquo;autres expressions logiques. D\u00e8s lors que plusieurs crit\u00e8res d&rsquo;exclusion doivent \u00eatre appliqu\u00e9s simultan\u00e9ment, l&rsquo;op\u00e9rateur doit \u00eatre manipul\u00e9 avec une stricte observation des lois de De Morgan. Par exemple, pour exclure \u00e0 la fois les enregistrements marqu\u00e9s comme &lsquo;Invalide&rsquo; et ceux annot\u00e9s comme &lsquo;Test&rsquo;, le praticien doit lier les expressions par un connecteur conjonctif <strong>AND<\/strong> :<\/p>\n<p><em>WHERE Diagnostic_Libelle NOT CONTAINS &lsquo;Invalide&rsquo; AND Diagnostic_Libelle NOT CONTAINS &lsquo;Test&rsquo;;<\/em><\/p>\n<p>La substitution erron\u00e9e du connecteur <strong>AND<\/strong> par un connecteur disjonctif <strong>OR<\/strong> constitue l&rsquo;une des fautes de logique les plus fr\u00e9quentes dans la programmation de filtres textuels. Une telle formulation conduirait en effet \u00e0 la s\u00e9lection universelle de la table, car un enregistrement contenant le mot &lsquo;Invalide&rsquo; satisfera trivialement la condition de ne pas contenir le mot &lsquo;Test&rsquo;, annulant de facto la port\u00e9e restrictive du filtrage.<\/p>\n<h2>3. Filtrage par listes discr\u00e8tes : L&rsquo;op\u00e9rateur IN et ses applications textuelles<\/h2>\n<h3>3.1 Diff\u00e9rence conceptuelle entre appartenance discr\u00e8te et inclusion de sous-cha\u00eene<\/h3>\n<p>Dans la bo\u00eete \u00e0 outils du programmeur SAS, il est imp\u00e9ratif d&rsquo;\u00e9tablir une ligne de d\u00e9marcation th\u00e9orique claire entre la d\u00e9tection d&rsquo;une sous-cha\u00eene (sub-string matching) et l&rsquo;\u00e9valuation d&rsquo;appartenance \u00e0 un ensemble discret de valeurs (membership testing). Alors que des op\u00e9rateurs comme <strong>CONTAINS<\/strong> recherchent un motif nich\u00e9 \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un vecteur textuel plus vaste, l&rsquo;op\u00e9rateur <strong>IN<\/strong> examine l&rsquo;\u00e9quivalence int\u00e9grale de la valeur de la variable par rapport \u00e0 une liste de cha\u00eenes constantes autoris\u00e9es.<\/p>\n<p>L&rsquo;op\u00e9rateur <strong>IN<\/strong> ne permet pas, par sa s\u00e9mantique fondamentale, de localiser un fragment isol\u00e9 au milieu d&rsquo;une phrase. Si une variable <em>Statut_Dossier<\/em> contient la valeur complexe \u00ab Cloture_Definitive_2023 \u00bb, la condition <em>WHERE Statut_Dossier IN (&lsquo;Cloture&rsquo;)<\/em> retournera une valeur logique FAUX, car la valeur scalaire de la variable n&rsquo;est pas strictement identique \u00e0 l&rsquo;\u00e9l\u00e9ment de la liste. En revanche, lorsque les modalit\u00e9s textuelles d&rsquo;un jeu de donn\u00e9es sont cat\u00e9goris\u00e9es et structur\u00e9es sous forme de libell\u00e9s codifi\u00e9s r\u00e9guliers, l&rsquo;op\u00e9rateur <strong>IN<\/strong> s&rsquo;av\u00e8re sup\u00e9rieur en termes de lisibilit\u00e9 et d&rsquo;optimisation machine.<\/p>\n<p>D&rsquo;un point de vue algorithmique, le moteur SAS compile la liste des constantes litt\u00e9rales fournie \u00e0 l&rsquo;op\u00e9rateur <strong>IN<\/strong> sous la forme d&rsquo;un tableau de hachage interne ou effectue une recherche binaire si le nombre d&rsquo;\u00e9l\u00e9ments le justifie. Cette optimisation interne rend l&rsquo;\u00e9valuation de l&rsquo;appartenance nettement plus rapide qu&rsquo;une succession de tests disjonctifs d&rsquo;inclusion partielle, en particulier lorsque le catalogue des statuts autoris\u00e9s comprend plusieurs dizaines d&rsquo;occurrences textuelles d\u00e9termin\u00e9es.<\/p>\n<h3>3.2 Syntaxe et param\u00e9trage de l&rsquo;op\u00e9rateur IN pour cha\u00eenes multiples<\/h3>\n<p>La formulation syntaxique canonique de l&rsquo;op\u00e9rateur <strong>IN<\/strong> pour les variables textuelles impose l&rsquo;encapsulation de la liste de valeurs cibles entre parenth\u00e8ses, chaque \u00e9l\u00e9ment \u00e9tant rigoureusement d\u00e9limit\u00e9 par des guillemets simples ou doubles, et s\u00e9par\u00e9 des autres par une virgule ou par un espace blanc. La structure g\u00e9n\u00e9rale s&rsquo;articule comme suit : <em>WHERE Nom_Variable IN (&lsquo;Modalite_A&rsquo;, &lsquo;Modalite_B&rsquo;, &lsquo;Modalite_C&rsquo;);<\/em>.<\/p>\n<p>Une sp\u00e9cificit\u00e9 critique de SAS concerne la gestion des longueurs de cha\u00eenes lors des comparaisons de listes. Lorsque SAS \u00e9value une variable caract\u00e8re par rapport \u00e0 une liste litt\u00e9rale dans un op\u00e9rateur <strong>IN<\/strong>, il se conforme aux r\u00e8gles d&rsquo;alignement du typage de donn\u00e9es. Si la variable cible poss\u00e8de une longueur d\u00e9clar\u00e9e de 10 octets et que la modalit\u00e9 recherch\u00e9e en comporte seulement 5, SAS proc\u00e8de conceptuellement \u00e0 une \u00e9galit\u00e9 apr\u00e8s avoir pris en compte ou neutralis\u00e9 les espaces de fin, selon le param\u00e9trage des options de comparaison.<\/p>\n<p>L&rsquo;op\u00e9rateur <strong>IN<\/strong> d\u00e9montre \u00e9galement une forte valeur ajout\u00e9e lorsqu&rsquo;il est interfac\u00e9 avec l&rsquo;\u00e9cosyst\u00e8me des macro-variables SAS. Dans les pipelines de traitement automatis\u00e9s, il est fr\u00e9quent qu&rsquo;une liste de cha\u00eenes de caract\u00e8res soit g\u00e9n\u00e9r\u00e9e dynamiquement au cours d&rsquo;une \u00e9tape pr\u00e9alable (via une clause <em>SELECT INTO :<\/em> sous PROC SQL) puis inject\u00e9e dans le filtrage d&rsquo;un Data Step. L&rsquo;\u00e9criture syntaxique prend alors la forme modulaire :<\/p>\n<p><em>WHERE Code_Region IN (&amp;Liste_Regions_Inclusion.);<\/em><\/p>\n<p>Cette approche garantit un d\u00e9couplage optimal entre la logique de d\u00e9finition des filtres m\u00e9tiers et le code d&rsquo;ex\u00e9cution des proc\u00e9dures d&rsquo;analyse statistique.<\/p>\n<h3>3.3 Gestion des espaces de queue et modificateurs de comparaison<\/h3>\n<p>L&rsquo;une des sources pr\u00e9\u00e9minentes d&rsquo;anomalies lors de la comparaison de cha\u00eenes de caract\u00e8res sous SAS r\u00e9side dans l&rsquo;existence des espaces de queue (trailing blanks). Par d\u00e9faut, SAS stocke les cha\u00eenes de caract\u00e8res sous forme de vecteurs d&rsquo;octets de longueur fixe. Par cons\u00e9quent, une variable d\u00e9finie par <em>LENGTH Code $8;<\/em> contenant la valeur &lsquo;SAS&rsquo; contiendra en r\u00e9alit\u00e9 les trois lettres suivies de cinq espaces blancs. Lors de l&rsquo;\u00e9valuation d&rsquo;une \u00e9galit\u00e9 discr\u00e8te, la norme ANSI\/SAS standard stipule que deux cha\u00eenes qui ne diff\u00e8rent que par le nombre d&rsquo;espaces finaux doivent \u00eatre consid\u00e9r\u00e9es comme \u00e9gales.<\/p>\n<p>Cependant, ce comportement peut \u00eatre modifi\u00e9 par des configurations d&rsquo;environnement ou lors de l&rsquo;ex\u00e9cution de requ\u00eates via des moteurs tiers (Pass-Through SQL vers des bases de donn\u00e9es relationnelles comme Oracle ou PostgreSQL). Pour contr\u00f4ler explicitement la rigueur de la comparaison au sein de l&rsquo;environnement SAS de base, l&rsquo;utilisation de modificateurs et de fonctions de cadrage s&rsquo;av\u00e8re indispensable.<\/p>\n<p>Sur le plan des performances compar\u00e9es, il est syst\u00e9matiquement pr\u00e9f\u00e9rable d&rsquo;utiliser l&rsquo;op\u00e9rateur <strong>IN<\/strong> plut\u00f4t qu&rsquo;une \u00e9num\u00e9ration de conditions reli\u00e9es par l&rsquo;op\u00e9rateur <strong>OR<\/strong> (par exemple, <em>WHERE Categorie = &lsquo;A&rsquo; OR Categorie = &lsquo;B&rsquo; OR Categorie = &lsquo;C&rsquo;;<\/em>). En plus d&rsquo;offrir une clart\u00e9 syntaxique indiscutable, l&rsquo;op\u00e9rateur <strong>IN<\/strong> permet au compilateur de requ\u00eates de factoriser l&rsquo;acc\u00e8s \u00e0 la variable et d&rsquo;utiliser une seule instruction de saut conditionnel au niveau du microprocesseur, r\u00e9duisant de mani\u00e8re mesurable l&#8217;empreinte CPU lors de l&rsquo;it\u00e9ration sur plusieurs dizaines de millions d&rsquo;enregistrements.<\/p>\n<h2>4. Fonctions de recherche textuelle natives : INDEX, FIND et leurs variantes<\/h2>\n<h3>4.1 La fonction INDEX : D\u00e9tection de position de sous-cha\u00eenes<\/h3>\n<p>Avant l&rsquo;enrichissement des fonctions de manipulation textuelle dans les versions modernes de SAS, la fonction <strong>INDEX<\/strong> repr\u00e9sentait la m\u00e9thode canonique pour localiser l&#8217;emplacement d&rsquo;une s\u00e9quence de caract\u00e8res au sein d&rsquo;un champ textuel. La signature de cette fonction scalaire s&rsquo;\u00e9nonce : <em>INDEX(source, extrait)<\/em>. Contrairement aux op\u00e9rateurs d&rsquo;\u00e9valuation logique comme <strong>CONTAINS<\/strong>, <strong>INDEX<\/strong> retourne une valeur num\u00e9rique enti\u00e8re correspondant \u00e0 la position ordinale (base 1) du premier caract\u00e8re de la sous-cha\u00eene localis\u00e9e. Si la sous-cha\u00eene est absente de la source, la fonction renvoie la valeur enti\u00e8re z\u00e9ro (0).<\/p>\n<p>L&rsquo;exploitation de la fonction <strong>INDEX<\/strong> \u00e0 des fins de filtrage repose sur la conversion implicite d&rsquo;un r\u00e9sultat arithm\u00e9tique en pr\u00e9dicat bool\u00e9en. Dans la logique interne de SAS, toute valeur num\u00e9rique diff\u00e9rente de z\u00e9ro et non manquante est \u00e9valu\u00e9e comme logiquement VRAIE, tandis que le z\u00e9ro est interpr\u00e9t\u00e9 comme FAUX. Ainsi, au sein d&rsquo;une \u00e9tape DATA, le filtrage conditionnel peut s&rsquo;\u00e9crire de mani\u00e8re condens\u00e9e :<\/p>\n<p><em>IF INDEX(Commentaire_Medical, &lsquo;pathologie&rsquo;) THEN OUTPUT;<\/em><\/p>\n<p>Ou, de fa\u00e7on plus formelle et explicite :<\/p>\n<p><em>WHERE INDEX(Commentaire_Medical, &lsquo;pathologie&rsquo;) &gt; 0;<\/em><\/p>\n<p>Bien que la fonction <strong>INDEX<\/strong> soit extr\u00eamement v\u00e9loce sur le plan de l&rsquo;ex\u00e9cution brute, elle partage avec l&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> une stricte sensibilit\u00e9 \u00e0 la casse. Sa principale limitation technique r\u00e9side dans son incapacit\u00e9 \u00e0 moduler la recherche sans l&rsquo;adjonction de fonctions p\u00e9riph\u00e9riques : elle recherche syst\u00e9matiquement de gauche \u00e0 droite, depuis le premier octet, et ne tol\u00e8re aucun param\u00e8tre de configuration sur la sensibilit\u00e9 typographique ou la direction du balayage.<\/p>\n<h3>4.2 La fonction FIND : Flexibilit\u00e9 et arguments modificateurs<\/h3>\n<p>Introduite pour pallier les contraintes rigides de la fonction <strong>INDEX<\/strong>, la fonction <strong>FIND<\/strong> constitue aujourd&rsquo;hui la r\u00e9f\u00e9rence pour la recherche textuelle avanc\u00e9e sous SAS. Sa syntaxe g\u00e9n\u00e9rale s&rsquo;articule autour de deux arguments obligatoires et de deux arguments optionnels : <em>FIND(source, extrait &lt;, modificateurs&gt; &lt;, position_depart&gt;)<\/em>. \u00c0 l&rsquo;instar d&rsquo;<strong>INDEX<\/strong>, elle retourne un entier indiquant l&rsquo;index de d\u00e9part du fragment d\u00e9tect\u00e9, ou z\u00e9ro en cas d&rsquo;\u00e9chec de la correspondance.<\/p>\n<p>La puissance distinctive de <strong>FIND<\/strong> r\u00e9side dans l&rsquo;int\u00e9gration native d&rsquo;arguments modificateurs pass\u00e9s sous forme de cha\u00eenes litt\u00e9rales de caract\u00e8res. Les deux modificateurs les plus d\u00e9terminants pour le filtrage sont :<\/p>\n<ul>\n<li><strong>Le modificateur &lsquo;i&rsquo; (ignore case) :<\/strong> Il rend la recherche totalement insensible \u00e0 la casse sans n\u00e9cessiter la conversion pr\u00e9alable de la variable source par les fonctions UPCASE ou LOWCASE. Cette \u00e9valuation directe au niveau du moteur de recherche interne optimise la consommation de m\u00e9moire cache et \u00e9vite les instanciations transitoires de cha\u00eenes modifi\u00e9es.<\/li>\n<li><strong>Le modificateur &lsquo;t&rsquo; (trim) :<\/strong> Il neutralise automatiquement les espaces de remplissage terminaux (trailing blanks) de la sous-cha\u00eene recherch\u00e9e, \u00e9vitant ainsi les faux \u00e9checs caus\u00e9s par un extrait contenant des blancs r\u00e9siduels non d\u00e9sir\u00e9s.<\/li>\n<\/ul>\n<p>Ces modificateurs peuvent \u00eatre combin\u00e9s au sein d&rsquo;un m\u00eame appel. Ainsi, l&rsquo;instruction :<\/p>\n<p><em>WHERE FIND(Historique_Clinique, &lsquo;diabete&rsquo;, &lsquo;it&rsquo;) &gt; 0;<\/em><\/p>\n<p>localisera avec succ\u00e8s les occurrences telles que \u00ab Diab\u00e8te \u00bb, \u00ab DIABETE \u00bb ou \u00ab Diab\u00e8te de type 2 \u00bb, sans \u00e9gards pour la casse initiale et sans risque de distorsion li\u00e9 aux espaces de queue. De surcro\u00eet, le param\u00e8tre <em>position_depart<\/em> permet d&rsquo;initier la recherche \u00e0 un index pr\u00e9cis, voire d&rsquo;inverser le sens de prospection (en sp\u00e9cifiant une position n\u00e9gative) pour explorer la cha\u00eene de droite \u00e0 gauche, conf\u00e9rant \u00e0 la fonction <strong>FIND<\/strong> une souplesse algorithmique in\u00e9gal\u00e9e.<\/p>\n<h3>4.3 La fonction FINDW : Ciblage des mots entiers<\/h3>\n<p>L&rsquo;un des d\u00e9fis les plus pernicieux du filtrage textuel par inclusion de sous-cha\u00eenes r\u00e9side dans le probl\u00e8me de l&rsquo;encapsulation lexicale. Par exemple, si l&rsquo;on recherche la sous-cha\u00eene \u00ab car \u00bb au moyen des fonctions <strong>INDEX<\/strong> ou <strong>FIND<\/strong>, le syst\u00e8me s\u00e9lectionnera in\u00e9vitablement des enregistrements contenant les mots \u00ab brancard \u00bb, \u00ab pancarte \u00bb ou \u00ab cardiaque \u00bb. Cette inclusion non intentionnelle g\u00e9n\u00e8re un volume substantiel de faux positifs qui fausse l&rsquo;analyse.<\/p>\n<p>Pour r\u00e9soudre rigoureusement cette probl\u00e9matique, SAS propose la fonction <strong>FINDW<\/strong> (Find Word). La sp\u00e9cificit\u00e9 de <strong>FINDW<\/strong> est qu&rsquo;elle n&rsquo;\u00e9value pas simplement une s\u00e9quence contigu\u00eb d&rsquo;octets, mais v\u00e9rifie que cette s\u00e9quence constitue un \u00ab mot \u00bb autonome au sens lexical. La signature de la fonction est la suivante : <em>FINDW(source, mot &lt;, delimiteurs&gt; &lt;, modificateurs&gt; &lt;, position_depart&gt;)<\/em>.<\/p>\n<p>Par d\u00e9faut, la fonction reconna\u00eet les d\u00e9limiteurs textuels standards de l&rsquo;\u00e9criture occidentale (espaces, tabulations, ponctuations usuelles telles que le point, la virgule, le point-virgule ou le point d&rsquo;exclamation). Il est toutefois possible de red\u00e9finir sur mesure la table des d\u00e9limiteurs accept\u00e9s via le troisi\u00e8me argument. Par ailleurs, <strong>FINDW<\/strong> int\u00e8gre \u00e9galement les modificateurs de la fonction FIND, notamment l&rsquo;argument &lsquo;i&rsquo; pour l&rsquo;insensibilit\u00e9 \u00e0 la casse. Ainsi, l&rsquo;instruction :<\/p>\n<p><em>WHERE FINDW(Observations, &lsquo;car&rsquo;, &lsquo; &lsquo;, &lsquo;i&rsquo;) &gt; 0;<\/em><\/p>\n<p>ne retiendra que les lignes o\u00f9 le terme \u00ab car \u00bb appara\u00eet isol\u00e9 comme unit\u00e9 lexicale ind\u00e9pendante, garantissant ainsi une \u00e9tanch\u00e9it\u00e9 s\u00e9mantique absolue du filtrage par rapport aux mots compos\u00e9s ou d\u00e9riv\u00e9s.<\/p>\n<h2>5. Gestion rigoureuse de la casse et harmonisation pr\u00e9alable<\/h2>\n<h3>5.1 Strat\u00e9gies de normalisation avec UPCASE et LOWCASE<\/h3>\n<p>Dans de nombreuses architectures de production et d&rsquo;entrep\u00f4ts de donn\u00e9es d\u00e9cisionnels (Data Warehouses), le filtrage direct n&rsquo;est que l&rsquo;aboutissement d&rsquo;une \u00e9tape d&rsquo;harmonisation textuelle pr\u00e9alable. La confrontation directe d&rsquo;algorithmes de recherche avec des corpus textuels non normalis\u00e9s induit un co\u00fbt de traitement r\u00e9current. Pour standardiser ces flux, la conversion explicite de casse via les fonctions scalaires <strong>UPCASE<\/strong> (conversion int\u00e9grale en majuscules) et <strong>LOWCASE<\/strong> (conversion int\u00e9grale en minuscules) repr\u00e9sente la strat\u00e9gie d&rsquo;ing\u00e9nierie la plus r\u00e9pandue.<\/p>\n<p>Lorsqu&rsquo;elle est mise en \u0153uvre directement dans l&rsquo;expression de s\u00e9lection, cette approche prend la forme d&rsquo;un encapsulage fonctionnel :<\/p>\n<p><em>WHERE UPCASE(Description_Produit) LIKE &lsquo;%ANTALGIQUE%&rsquo;;<\/em><\/p>\n<p>Cependant, l&rsquo;application it\u00e9rative de fonctions de modification de casse sur des colonnes volumineuses lors d&rsquo;une \u00e9tape de filtrage implique une consommation non n\u00e9gligeable de cycles processeur. Pour chaque observation inspect\u00e9e, le moteur SAS doit cr\u00e9er une copie de la cha\u00eene en m\u00e9moire, transformer chaque octet alphab\u00e9tique en son \u00e9quivalent majuscule ou minuscule selon les tables d&rsquo;encodage du syst\u00e8me d&rsquo;exploitation, puis ex\u00e9cuter l&rsquo;algorithme de concordance de motif. Sur des volum\u00e9tries atteignant plusieurs dizaines de gigaoctets, cette p\u00e9nalit\u00e9 computationnelle justifie pleinement la mise en \u0153uvre d&rsquo;une phase de pr\u00e9paration distincte (data staging), au cours de laquelle une variable normalis\u00e9e d\u00e9di\u00e9e est mat\u00e9rialis\u00e9e de mani\u00e8re permanente sur le disque et index\u00e9e.<\/p>\n<h3>5.2 Utilisation de la fonction PROPCASE pour les structures textuelles formelles<\/h3>\n<p>En dehors des transformations unilat\u00e9rales en majuscules ou minuscules, la fonction <strong>PROPCASE<\/strong> applique une convention de casse dite \u00ab casse de nom propre \u00bb (Title Case ou Proper Case), o\u00f9 le premier caract\u00e8re de chaque mot est converti en majuscule tandis que les caract\u00e8res subs\u00e9quents sont transform\u00e9s en minuscules. Cette fonction accepte en second argument optionnel une liste de d\u00e9limiteurs personnalis\u00e9s permettant de contr\u00f4ler pr\u00e9cis\u00e9ment la fronti\u00e8re entre les unit\u00e9s lexicales.<\/p>\n<p>La fonction <strong>PROPCASE<\/strong> trouve son utilit\u00e9 principale dans l&rsquo;assainissement de colonnes nominales structur\u00e9es, telles que les identit\u00e9s des patients, les d\u00e9signations g\u00e9ographiques ou les noms de sp\u00e9cialit\u00e9s pharmaceutiques saisis de mani\u00e8re d\u00e9sordonn\u00e9e dans des interfaces transactionnelles :<\/p>\n<p><em>Nom_Normalise = PROPCASE(Nom_Patient, \u00a0\u00bb -&lsquo;\u00a0\u00bb);<\/em><\/p>\n<p>Toutefois, son d\u00e9ploiement \u00e0 des fins de filtrage de sous-cha\u00eenes requiert une vigilance m\u00e9thodologique extr\u00eame. <strong>PROPCASE<\/strong> est inadapt\u00e9e au traitement de cha\u00eenes contenant des acronymes, des codes nosologiques normalis\u00e9s (tels que la CIM-10 ou le DSM-5) ou des terminologies scientifiques comportant des majuscules internes (par exemple, les noms de mol\u00e9cules comme \u00ab mRNA \u00bb ou \u00ab IFN-gamma \u00bb). Une conversion aveugle par <strong>PROPCASE<\/strong> risque de d\u00e9naturer la morphologie de ces motifs sp\u00e9cifiques et d&rsquo;invalider par cons\u00e9quent la recherche de sous-cha\u00eenes cibl\u00e9es. Son emploi doit \u00eatre restreint aux flux de validation typographique de donn\u00e9es civiles ou administratives conventionnelles.<\/p>\n<h2>6. Filtrage par motifs complexes : Les expressions r\u00e9guli\u00e8res avec PRXMATCH<\/h2>\n<h3>6.1 Principes des fonctions Perl Regular Expressions (PRX) dans SAS<\/h3>\n<p>Lorsque la condition de filtrage ne repose plus sur une s\u00e9quence litt\u00e9rale invariable, mais sur une classe de motifs syntaxiques hautement variables (tels que des structures de codes postaux h\u00e9t\u00e9rog\u00e8nes, des formats de num\u00e9ros de s\u00e9curit\u00e9 sociale ou des terminologies cliniques sujettes \u00e0 de multiples flexions morphologiques), les op\u00e9rateurs d\u00e9terministes comme <strong>CONTAINS<\/strong> ou <strong>FIND<\/strong> atteignent leurs limites structurales. SAS r\u00e9pond \u00e0 cette exigence analytique en int\u00e9grant nativement le moteur d&rsquo;expressions r\u00e9guli\u00e8res compatibles avec le langage Perl (Perl Regular Expressions, ou PRX).<\/p>\n<p>La fonction ma\u00eetresse pour le filtrage par motif au sein de cette biblioth\u00e8que est <strong>PRXMATCH<\/strong>. Sa signature s&rsquo;\u00e9nonce : <em>PRXMATCH(motif_ou_id, source)<\/em>. La fonction retourne un entier indiquant la position de d\u00e9part du premier caract\u00e8re satisfaisant l&rsquo;expression r\u00e9guli\u00e8re dans la cha\u00eene source, ou z\u00e9ro si le motif n&rsquo;est pas localis\u00e9. La sp\u00e9cification du motif peut se faire de deux mani\u00e8res distinctes : soit par la fourniture directe d&rsquo;une cha\u00eene litt\u00e9rale compil\u00e9e \u00e0 la vol\u00e9e d\u00e9limit\u00e9e par des barres obliques (par exemple, <em>&lsquo;\/motif\/&rsquo;<\/em>), soit par l&rsquo;utilisation d&rsquo;un identifiant num\u00e9rique pr\u00e9compil\u00e9 g\u00e9n\u00e9r\u00e9 par la fonction <strong>PRXPARSE<\/strong>.<\/p>\n<p>Sur le plan de l&rsquo;architecture logicielle, la pr\u00e9compilation via <strong>PRXPARSE<\/strong> repr\u00e9sente la norme d&rsquo;excellence au sein de l&rsquo;\u00e9tape DATA. Elle compile l&rsquo;automate d&rsquo;\u00e9tats finis de l&rsquo;expression r\u00e9guli\u00e8re une seule et unique fois lors de la phase d&rsquo;initialisation de l&rsquo;\u00e9tape DATA, \u00e9vitant ainsi le co\u00fbt prohibitif d&rsquo;une recompilation syntaxique \u00e0 chaque nouvelle observation trait\u00e9e dans la boucle d&rsquo;ex\u00e9cution.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/contains2.jpg\" alt=\"\" \/><\/figure>\n<h3>6.2 \u00c9criture de motifs textuels pour le filtrage d&rsquo;enregistrements<\/h3>\n<p>La puissance du moteur PRX r\u00e9side dans la richesse de sa m\u00e9tasyntaxe, qui permet de d\u00e9finir des abstractions de motifs d&rsquo;une grande compacit\u00e9. Le programmeur peut employer des classes de caract\u00e8res (par exemple, <em>d<\/em> pour tout chiffre, <em>w<\/em> pour tout caract\u00e8re alphanum\u00e9rique), des quantificateurs d&rsquo;occurrence (<em>+<\/em>, <em>*<\/em>, <em>{n,m}<\/em>), des m\u00e9tacaract\u00e8res d&rsquo;ancrage (<em>^<\/em> pour borner au d\u00e9but de la cha\u00eene, <em>$<\/em> pour borner \u00e0 la fin) ainsi que des op\u00e9rateurs de disjonction logique (<em>|<\/em>).<\/p>\n<p>Consid\u00e9rons le besoin d&rsquo;isoler dans un registre \u00e9pid\u00e9miologique l&rsquo;ensemble des mentions textuelles renvoyant \u00e0 une affection coronaire aigu\u00eb, sous des orthographes variables telles que \u00ab infarctus \u00bb, \u00ab isch\u00e9mie \u00bb ou leurs formes abr\u00e9g\u00e9es m\u00e9dicales courantes. Une clause de s\u00e9lection bas\u00e9e sur <strong>PRXMATCH<\/strong> s&rsquo;\u00e9crira au sein de l&rsquo;\u00e9tape DATA :<\/p>\n<p><em>IF PRXMATCH(&lsquo;\/(infarctus|ischem(ie|ique)|sca)\/i&rsquo;, Diagnostic_Texte) &gt; 0 THEN OUTPUT;<\/em><\/p>\n<p>Dans cette formulation, l&rsquo;expression r\u00e9guli\u00e8re r\u00e9sout trois d\u00e9fis en une seule passe : l&rsquo;op\u00e9rateur de disjonction (barre verticale) prend en charge l&rsquo;alternative lexicale ; les parenth\u00e8ses groupent les sous-motifs morphologiques ; et le modificateur final &lsquo;i&rsquo; garantit une insensibilit\u00e9 totale \u00e0 la casse. De m\u00eame, l&rsquo;usage des ancres permet d&rsquo;\u00e9viter les pi\u00e8ges de d\u00e9tection non voulue :<\/p>\n<p><em>WHERE PRXMATCH(&lsquo;\/^DIABd{2}\/&rsquo;, Code_Diagnostic) &gt; 0;<\/em><\/p>\n<p>Cette condition filtrera exclusivement les enregistrements dont la cha\u00eene commence obligatoirement par le pr\u00e9fixe \u00ab DIAB \u00bb suivi d&rsquo;exactement deux chiffres, rejetant toute ligne o\u00f9 ce motif appara\u00eetrait de fa\u00e7on fortuite au milieu ou \u00e0 la fin du champ.<\/p>\n<h3>6.3 Comparaison de robustesse : Op\u00e9rateurs standards contre PRXMATCH<\/h3>\n<p>L&rsquo;arbitrage entre l&rsquo;usage des op\u00e9rateurs scalaires standards (<strong>CONTAINS<\/strong>, <strong>FIND<\/strong>) et le recours aux expressions r\u00e9guli\u00e8res (<strong>PRXMATCH<\/strong>) implique un compromis critique entre expressivit\u00e9 syntaxique et charge computationnelle. Le d\u00e9ploiement d&rsquo;un moteur d&rsquo;expressions r\u00e9guli\u00e8res s&rsquo;accompagne d&rsquo;une surconsommation notable de cycles CPU due \u00e0 la complexit\u00e9 de l&rsquo;automate d\u00e9terministe ou non d\u00e9terministe sous-jacent, capable de revenir sur ses pas (backtracking) lors de motifs ambigus.<\/p>\n<p>Les m\u00e9triques de performance d\u00e9montrent que pour la recherche d&rsquo;une sous-cha\u00eene fixe et invariable, l&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> ou la fonction <strong>FIND<\/strong> ex\u00e9cutent la requ\u00eate entre 3 et 10 fois plus vite que <strong>PRXMATCH<\/strong>. En cons\u00e9quence, la r\u00e8gle architecturale pr\u00e9conise de restreindre l&rsquo;usage de PRXMATCH aux cas de figure o\u00f9 les op\u00e9rateurs traditionnels n\u00e9cessiteraient une prolif\u00e9ration ing\u00e9rable de clauses conditionnelles imbriqu\u00e9es ou l&rsquo;application de cascades de fonctions textuelles difficilement maintenables.<\/p>\n<p>En termes de maintenabilit\u00e9 applicative, les expressions r\u00e9guli\u00e8res introduisent \u00e9galement une dette technique potentielle. La lisibilit\u00e9 d&rsquo;un motif complexe peut \u00eatre ardue pour des relecteurs de code tiers. Il est donc recommand\u00e9 d&rsquo;accompagner syst\u00e9matiquement les motifs PRX d&rsquo;une documentation interne explicitant la grammaire formelle recherch\u00e9e, afin de p\u00e9renniser la conformit\u00e9 du code au sein des environnements d&rsquo;analyse collaboratifs.<\/p>\n<h2>7. Diff\u00e9rences fondamentales entre les instructions WHERE et IF<\/h2>\n<h3>7.1 Moment d&rsquo;\u00e9valuation dans le pipeline de donn\u00e9es SAS<\/h3>\n<p>Pour concevoir des filtres d&rsquo;une efficacit\u00e9 optimale, le d\u00e9veloppeur SAS doit ma\u00eetriser la chronologie exacte de l&rsquo;ex\u00e9cution des instructions \u00e0 l&rsquo;int\u00e9rieur du moteur de donn\u00e9es. L&rsquo;instruction <strong>WHERE<\/strong> et le sous-ensemble conditionnel <strong>IF<\/strong> illustrent deux moments d&rsquo;intervention profond\u00e9ment discordants dans le pipeline de traitement, tel que synth\u00e9tis\u00e9 ci-dessous :<\/p>\n<ul>\n<li><strong>Instruction WHERE :<\/strong> \u00c9valuation pr\u00e9coce au niveau du moteur de lecture (Engine level). L&rsquo;observation est inspect\u00e9e directement depuis le flux disque\/tampon. Si la condition textuelle n&rsquo;est pas satisfaite, l&rsquo;observation est \u00e9limin\u00e9e imm\u00e9diatement sans jamais franchir le seuil du Program Data Vector (PDV).<\/li>\n<li><strong>Instruction IF :<\/strong> \u00c9valuation tardive au sein de l&rsquo;\u00e9tape DATA (Program execution level). L&rsquo;observation est obligatoirement charg\u00e9e dans le PDV, les adresses m\u00e9moire des variables sont r\u00e9solues, et les \u00e9ventuelles op\u00e9rations d&rsquo;assignation amont sont ex\u00e9cut\u00e9es avant que le pr\u00e9dicat ne soit analys\u00e9.<\/li>\n<\/ul>\n<p>Cette divergence structurelle produit un impact d\u00e9terminant sur les performances globales du syst\u00e8me d&rsquo;information. Sur des tables contenant des dizaines de millions d&rsquo;enregistrements, l&rsquo;instruction <strong>WHERE<\/strong> pr\u00e9serve la bande passante du bus d&rsquo;entr\u00e9es\/sorties en \u00e9liminant un volume consid\u00e9rable d&rsquo;enregistrements superflus d\u00e8s la phase d&rsquo;ingestion. \u00c0 l&rsquo;inverse, l&rsquo;instruction <strong>IF<\/strong> sollicite l&rsquo;int\u00e9gralit\u00e9 du cycle de transfert des donn\u00e9es vers le PDV pour chaque ligne de la table source, rendant le traitement consid\u00e9rablement plus lent d\u00e8s lors que le taux de rejet du filtre est \u00e9lev\u00e9.<\/p>\n<h3>7.2 Disponibilit\u00e9 des variables d\u00e9riv\u00e9es et calcul\u00e9es<\/h3>\n<p>La contrepartie directe de l&rsquo;\u00e9valuation pr\u00e9coce de l&rsquo;instruction <strong>WHERE<\/strong> r\u00e9side dans son imperm\u00e9abilit\u00e9 totale aux variables cr\u00e9\u00e9es, d\u00e9riv\u00e9es ou modifi\u00e9es \u00e0 l&rsquo;int\u00e9rieur m\u00eame de l&rsquo;\u00e9tape DATA en cours d&rsquo;ex\u00e9cution. \u00c9tant donn\u00e9 que le moteur <strong>WHERE<\/strong> r\u00e9sout ses conditions avant l&rsquo;instanciation du PDV, il ne poss\u00e8de aucune visibilit\u00e9 sur les colonnes n\u00e9es de calculs arithm\u00e9tiques, de concat\u00e9nations textuelles ou de lectures conditionnelles intervenant plus bas dans le script.<\/p>\n<p>Soit l&rsquo;exemple d&rsquo;un script visant \u00e0 concat\u00e9ner deux champs textuels distincts avant filtrage :<\/p>\n<p><em>DATA Patients_Cibles; SET Registre_Initial; Libelle_Complet = CATX(&lsquo; &#8211; &lsquo;, Code_Pathologie, Description); IF FIND(Libelle_Complet, &lsquo;Critique&rsquo;, &lsquo;i&rsquo;) &gt; 0; RUN;<\/em><\/p>\n<p>Dans ce sc\u00e9nario, l&rsquo;utilisation de l&rsquo;instruction <em>WHERE FIND(Libelle_Complet, &lsquo;Critique&rsquo;, &lsquo;i&rsquo;) &gt; 0;<\/em> provoquerait un arr\u00eat imm\u00e9diat de la compilation SAS avec un message d&rsquo;erreur stipulant que la variable <em>Libelle_Complet<\/em> est introuvable sur la table source <em>Registre_Initial<\/em>. L&rsquo;instruction <strong>IF<\/strong> devient donc structurellement incontournable d\u00e8s lors que la s\u00e9lection repose sur des agr\u00e9gats ou des mutations textuelles synth\u00e9tis\u00e9s au vol.<\/p>\n<p>Pour optimiser de tels cas de figure, une strat\u00e9gie hybride est fr\u00e9quemment mise en \u0153uvre : un pr\u00e9-filtrage par <strong>WHERE<\/strong> \u00e9limine le gros des donn\u00e9es brutes in\u00e9ligibles en amont, puis un affinage conditionnel par <strong>IF<\/strong> op\u00e8re sur les variables calcul\u00e9es au sein du sous-ensemble restreint, combinant ainsi \u00e9conomie d&rsquo;entr\u00e9es\/sorties et souplesse transformationnelle.<\/p>\n<h3>7.3 Compatibilit\u00e9 des instructions avec les proc\u00e9dures SAS (PROC SQL, PROC PRINT)<\/h3>\n<p>L&rsquo;universalit\u00e9 fonctionnelle de la clause <strong>WHERE<\/strong> constitue un atout capital dans l&rsquo;architecture SAS. Alors que l&rsquo;instruction <strong>IF<\/strong> est strictement confin\u00e9e au p\u00e9rim\u00e8tre de l&rsquo;\u00e9tape DATA, la clause <strong>WHERE<\/strong> peut \u00eatre d\u00e9ploy\u00e9e au sein de la quasi-totalit\u00e9 des proc\u00e9dures analytiques et de reporting (notamment PROC PRINT, PROC FREQ, PROC MEANS, PROC SUMMARY, PROC REG ou PROC LOGISTIC). Cette int\u00e9gration permet d&rsquo;ex\u00e9cuter des analyses statistiques ou des pr\u00e9sentations tabulaires directement sur un sous-ensemble textuel sans avoir \u00e0 mat\u00e9rialiser au pr\u00e9alable une table interm\u00e9diaire sur le disque de travail (biblioth\u00e8que WORK).<\/p>\n<p>De surcro\u00eet, au sein de l&rsquo;environnement <strong>PROC SQL<\/strong>, la clause <strong>WHERE<\/strong> s&rsquo;aligne fid\u00e8lement sur les normes internationales du standard ANSI SQL. Lors de l&rsquo;interrogation de bases de donn\u00e9es relationnelles distantes via le composant SAS\/ACCESS, le moteur SAS est capable d&rsquo;effectuer une \u00ab pouss\u00e9e de pr\u00e9dicat \u00bb (Predicate Pushdown). Il traduit la clause SAS en dialecte SQL natif du serveur cible (par exemple, transformation de l&rsquo;op\u00e9rateur CONTAINS en un pr\u00e9dicat relationnel <em>LIKE &lsquo;%valeur%&rsquo;<\/em>) et d\u00e9l\u00e8gue l&rsquo;effort de filtrage textuel au serveur de base de donn\u00e9es h\u00f4te, rapatriant uniquement les enregistrements pertinents \u00e0 travers le r\u00e9seau informatique.<\/p>\n<h2>8. Optimisation des performances lors du filtrage textuel massif<\/h2>\n<h3>8.1 Utilisation des index SAS sur les variables de type caract\u00e8re<\/h3>\n<p>L&rsquo;optimisation du temps d&rsquo;acc\u00e8s aux enregistrements lors du filtrage de volum\u00e9tries massives repose largement sur la conception et l&rsquo;exploitation d&rsquo;index SAS simples ou composites. Un index SAS est une structure arborescente (g\u00e9n\u00e9ralement un B-Tree) stock\u00e9e dans un fichier distinct (.sas7bndx), qui associe les valeurs distinctes d&rsquo;une variable aux identifiants physiques des observations correspondantes (Records ID). Toutefois, l&rsquo;interaction entre les index et les crit\u00e8res de filtrage textuel ob\u00e9it \u00e0 des contraintes techniques tr\u00e8s rigides.<\/p>\n<p>Pour qu&rsquo;un index textuel puisse \u00eatre exploit\u00e9 efficacement par l&rsquo;optimiseur de requ\u00eates SAS dans une clause <strong>WHERE<\/strong>, la condition doit porter sur une correspondance exacte (op\u00e9rateur d&rsquo;\u00e9galit\u00e9 ou op\u00e9rateur <strong>IN<\/strong>) ou sur une recherche de pr\u00e9fixe d\u00e9butant au premier octet de la cha\u00eene. D\u00e8s lors que l&rsquo;on emploie l&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> ou des fonctions de recherche scalaire (<strong>FIND<\/strong>, <strong>INDEX<\/strong>), l&rsquo;index devient structurellement inop\u00e9rant. En effet, l&rsquo;architecture B-Tree est con\u00e7ue pour ordonner les cha\u00eenes de gauche \u00e0 droite ; elle ne permet pas de localiser efficacement une sous-cha\u00eene dont l&rsquo;ancrage initial est ind\u00e9termin\u00e9 sans parcourir l&rsquo;ensemble de la structure arborescente.<\/p>\n<p>En pr\u00e9sence d&rsquo;une clause du type <em>WHERE Nom_Variable CONTAINS &lsquo;motif&rsquo;<\/em>, l&rsquo;optimiseur de requ\u00eates SAS d\u00e9sactive l&rsquo;index et bascule syst\u00e9matiquement sur un balayage s\u00e9quentiel int\u00e9gral de la table (Full Table Scan). Le d\u00e9veloppeur ne doit donc pas pr\u00e9sumer qu&rsquo;une colonne index\u00e9e acc\u00e9l\u00e9rera automatiquement une recherche d&rsquo;inclusion arbitraire.<\/p>\n<h3>8.2 Gestion de la m\u00e9moire et s\u00e9lection des colonnes (Instruction KEEP\/DROP)<\/h3>\n<p>L&rsquo;allocation de m\u00e9moire pour le Program Data Vector est directement proportionnelle \u00e0 la somme des longueurs d\u00e9clar\u00e9es de l&rsquo;ensemble des variables composant l&rsquo;enregistrement. Dans le traitement de m\u00e9gadonn\u00e9es comportant des variables textuelles \u00e9tendues (pouvant atteindre plusieurs milliers d&rsquo;octets par colonne), la saturation de la bande passante m\u00e9moire devient le principal goulot d&rsquo;\u00e9tranglement de l&rsquo;application.<\/p>\n<p>Pour maximiser le d\u00e9bit de traitement lors des op\u00e9rations de filtrage textuel intensif, il est fondamental de purger imm\u00e9diatement le flux des colonnes non indispensables \u00e0 la cha\u00eene d&rsquo;analyse via les options de table <strong>KEEP=<\/strong> ou <strong>DROP=<\/strong> directement lors de l&rsquo;instruction d&rsquo;entr\u00e9e <strong>SET<\/strong> :<\/p>\n<p><em>DATA Resultat; SET Source(KEEP=Identifiant Commentaire Statut); WHERE FIND(Commentaire, &lsquo;Urgence&rsquo;, &lsquo;i&rsquo;) &gt; 0; RUN;<\/em><\/p>\n<p>Cette sp\u00e9cification pr\u00e9vient le chargement en m\u00e9moire vive de dizaines d&rsquo;autres colonnes volumineuses pour les observations qui seront in fine rejet\u00e9es par le filtre textuel. Parall\u00e8lement, un dimensionnement strict des variables \u00e0 l&rsquo;aide de l&rsquo;instruction <strong>LENGTH<\/strong> permet d&rsquo;ajuster l&rsquo;enveloppe m\u00e9moire allou\u00e9e au strict n\u00e9cessaire, \u00e9vitant de r\u00e9server des allocations standard de 200 octets pour des codes diagnostiques n&rsquo;en exploitant qu&rsquo;une dizaine. Une r\u00e9duction de moiti\u00e9 de la largeur du PDV se traduit quasi-lin\u00e9airement par un doublement de la vitesse de balayage s\u00e9quentiel par le microprocesseur.<\/p>\n<h3>8.3 Utilisation de l&rsquo;op\u00e9rateur LIKE et comparaison avec les jokers SQL<\/h3>\n<p>L&rsquo;op\u00e9rateur <strong>LIKE<\/strong> constitue un compromis d&rsquo;une redoutable efficacit\u00e9 entre la simplicit\u00e9 de l&rsquo;op\u00e9rateur CONTAINS et la rigueur d&rsquo;acc\u00e8s permise par les index. Issu de la normalisation relationnelle SQL, l&rsquo;op\u00e9rateur <strong>LIKE<\/strong> s&rsquo;appuie sur deux m\u00e9tacaract\u00e8res universels :<\/p>\n<ul>\n<li><strong>Le symbole pourcentage (%) :<\/strong> Repr\u00e9sente n&rsquo;importe quelle s\u00e9quence de z\u00e9ro, un ou plusieurs caract\u00e8res.<\/li>\n<li><strong>Le symbole trait de soulignement (_) :<\/strong> Repr\u00e9sente un unique caract\u00e8re arbitraire quelconque.<\/li>\n<\/ul>\n<p>Dans la formulation d&rsquo;un filtre textuel, la clause <em>WHERE Variable LIKE &lsquo;%cible%&rsquo;<\/em> produit un r\u00e9sultat s\u00e9mantiquement \u00e9quivalent \u00e0 <em>WHERE Variable CONTAINS &lsquo;cible&rsquo;<\/em>. Toutefois, la sup\u00e9riorit\u00e9 structurelle de <strong>LIKE<\/strong> r\u00e9side dans sa capacit\u00e9 \u00e0 restreindre l&rsquo;ambigu\u00eft\u00e9 de position. Si le praticien sait que la sous-cha\u00eene recherch\u00e9e commence obligatoirement par un radical pr\u00e9cis, l&rsquo;expression s&rsquo;\u00e9noncera sous la forme d&rsquo;une recherche de pr\u00e9fixe :<\/p>\n<p><em>WHERE Code_Classification LIKE &lsquo;CARDIO%&rsquo;;<\/em><\/p>\n<p>Contrairement \u00e0 <strong>CONTAINS<\/strong>, une condition <strong>LIKE<\/strong> configur\u00e9e sous forme de pr\u00e9fixe (sans le m\u00e9tacaract\u00e8re &lsquo;%&rsquo; en premi\u00e8re position) est reconnue par l&rsquo;optimiseur de requ\u00eates SAS comme \u00e9tant \u00e9ligible \u00e0 l&rsquo;utilisation des index B-Tree. Le moteur peut alors effectuer une recherche par saut d&rsquo;index direct pour extraire les enregistrements en quelques millisecondes, \u00e9vitant ainsi le balayage de dizaines de millions de lignes.<\/p>\n<h2>9. Nettoyage des donn\u00e9es et gestion des valeurs manquantes<\/h2>\n<h3>9.1 Traitement des espaces superflus avec STRIP, COMPBL et COMPRESS<\/h3>\n<p>L&rsquo;incoh\u00e9rence des espaces blancs constitue la cause principale d&rsquo;anomalies lors de l&rsquo;application de filtres textuels sous SAS. Des cha\u00eenes contenant des blancs ins\u00e9cables, des tabulations ind\u00e9sirables, des doubles espaces interstitiels ou des espaces r\u00e9siduels en t\u00eate de variable peuvent invalider silencieusement les crit\u00e8res de filtrage les plus \u00e9labor\u00e9s. Un protocole robuste d&rsquo;assainissement s&rsquo;appuie sur un triptyque fonctionnel hautement sp\u00e9cialis\u00e9 :<\/p>\n<ul>\n<li><strong>La fonction STRIP :<\/strong> \u00c9limine l&rsquo;ensemble des espaces situ\u00e9s \u00e0 l&rsquo;avant (leading blanks) et \u00e0 l&rsquo;arri\u00e8re (trailing blanks) de la cha\u00eene. Elle s&rsquo;av\u00e8re nettement sup\u00e9rieure \u00e0 la fonction <strong>TRIM<\/strong> historique, qui n&rsquo;assure que le nettoyage des espaces de queue sans alt\u00e9rer les blancs de t\u00eate.<\/li>\n<li><strong>La fonction COMPBL :<\/strong> Identifie toutes les s\u00e9quences de deux espaces cons\u00e9cutifs ou plus \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une cha\u00eene et les compresse en un unique espace standard. Elle est indispensable pour normaliser les verbatims avant toute analyse lexicale.<\/li>\n<li><strong>La fonction COMPRESS :<\/strong> Dans sa configuration standard, elle supprime l&rsquo;int\u00e9gralit\u00e9 des espaces d&rsquo;une variable. Dot\u00e9e de modificateurs optionnels, elle permet de purger de mani\u00e8re cibl\u00e9e des familles enti\u00e8res de glyphes, tels que la ponctuation, les caract\u00e8res de contr\u00f4le non imprimables ou les caract\u00e8res num\u00e9riques.<\/li>\n<\/ul>\n<p>L&rsquo;incorporation de ces fonctions au sein m\u00eame de la logique de filtrage permet d&rsquo;immuniser le traitement contre les perturbations typographiques structurelles :<\/p>\n<p><em>WHERE FIND(COMPBL(STRIP(Libelle_Entree)), &lsquo;Condition Cible&rsquo;, &lsquo;i&rsquo;) &gt; 0;<\/em><\/p>\n<p>Cette instruction garantit que ni un espace superflu plac\u00e9 accidentellement au d\u00e9but du champ par l&rsquo;op\u00e9rateur de saisie, ni une double frappe de la barre d&rsquo;espace entre les termes ne pourront faire \u00e9chec \u00e0 l&rsquo;inclusion de l&rsquo;observation dans la cohorte d&rsquo;analyse.<\/p>\n<h3>9.2 Interaction entre filtres de cha\u00eenes et valeurs manquantes (Missing Values)<\/h3>\n<p>La s\u00e9mantique des valeurs manquantes pour les variables textuelles sous SAS diverge substantiellement de celle des variables num\u00e9riques. Tandis qu&rsquo;une absence de valeur num\u00e9rique est encod\u00e9e en interne par un point (. ou lettres sp\u00e9ciales pour les missing values \u00e9tendues), une valeur manquante de caract\u00e8re est tout simplement repr\u00e9sent\u00e9e par une cha\u00eene de longueur fixe int\u00e9gralement remplie d&rsquo;espaces blancs, commun\u00e9ment d\u00e9sign\u00e9e sous le terme de cha\u00eene vide (blank string).<\/p>\n<p>L&rsquo;application d&rsquo;un op\u00e9rateur de filtrage textuel sur une variable contenant une valeur manquante induit des comportements contrast\u00e9s qu&rsquo;il importe de ma\u00eetriser pour pr\u00e9venir les distorsions d&rsquo;\u00e9chantillonnage :<\/p>\n<ul>\n<li>Si l&rsquo;on \u00e9value l&rsquo;\u00e9galit\u00e9 par rapport \u00e0 une cha\u00eene vide (<em>WHERE Variable = &lsquo; &lsquo;;<\/em>), l&rsquo;expression retourne VRAI pour toute observation n&rsquo;abritant que des espaces.<\/li>\n<li>Si l&rsquo;on applique l&rsquo;op\u00e9rateur <strong>CONTAINS<\/strong> avec une constante non vide (<em>WHERE Variable CONTAINS &lsquo;ABC&rsquo;;<\/em>), la condition est logiquement FAUSSE pour les enregistrements manquants, qui sont donc proprement \u00e9cart\u00e9s.<\/li>\n<li>En revanche, si la cha\u00eene de recherche elle-m\u00eame est vide (<em>WHERE Variable CONTAINS \u00a0\u00bb;<\/em>), l&rsquo;\u00e9valuation logique retourne universellement VRAI pour toutes les observations de la table, y compris les cha\u00eenes manquantes, cr\u00e9ant une faille de filtrage critique.<\/li>\n<\/ul>\n<p>Pour contr\u00f4ler sans ambigu\u00eft\u00e9 la pr\u00e9sence ou l&rsquo;absence de valeurs textuelles, l&rsquo;environnement SAS propose la fonction d\u00e9di\u00e9e <strong>MISSING<\/strong>. Son \u00e9valuation retourne la valeur binaire 1 si l&rsquo;argument est manquant, et 0 dans le cas contraire. L&rsquo;utilisation de cette fonction stabilise les conditions complexes :<\/p>\n<p><em>WHERE NOT MISSING(Diagnostic_Libelle) AND FIND(Diagnostic_Libelle, &lsquo;Cible&rsquo;, &lsquo;i&rsquo;) &gt; 0;<\/em><\/p>\n<p>Cette formulation garantit l&rsquo;exclusion formelle et pr\u00e9ventive des entr\u00e9es non renseign\u00e9es avant le d\u00e9clenchement de l&rsquo;algorithme d&rsquo;inspection textuelle.<\/p>\n<h2>10. Filtrage multicrit\u00e8re combinant cha\u00eenes de caract\u00e8res et variables num\u00e9riques<\/h2>\n<h3>10.1 Hi\u00e9rarchie des op\u00e9rateurs logiques et pr\u00e9c\u00e9dence bool\u00e9enne<\/h3>\n<p>L&rsquo;extraction de sous-populations repr\u00e9sentatives dans les contextes de recherche quantitative implique quasi syst\u00e9matiquement le croisement de m\u00e9tadonn\u00e9es qualitatives (libell\u00e9s, comptes-rendus) et de m\u00e9triques quantitatives (\u00e2ges, posologies, param\u00e8tres biologiques, montants financiers). L&rsquo;\u00e9laboration de ces filtres multicrit\u00e8res impose une rigueur absolue dans l&rsquo;agencement des op\u00e9rateurs de conjonction (<strong>AND<\/strong>), de disjonction (<strong>OR<\/strong>) et de n\u00e9gation (<strong>NOT<\/strong>).<\/p>\n<p>Selon les sp\u00e9cifications formelles de SAS, l&rsquo;ordre d&rsquo;\u00e9valuation standard des op\u00e9rateurs logiques ob\u00e9it \u00e0 une hi\u00e9rarchie stricte : l&rsquo;op\u00e9rateur <strong>NOT<\/strong> poss\u00e8de la priorit\u00e9 d&rsquo;ex\u00e9cution la plus \u00e9lev\u00e9e, suivi imm\u00e9diatement par l&rsquo;op\u00e9rateur conjonctif <strong>AND<\/strong>, tandis que l&rsquo;op\u00e9rateur disjonctif <strong>OR<\/strong> poss\u00e8de le niveau de pr\u00e9c\u00e9dence le plus faible. Cette hi\u00e9rarchie implique qu&rsquo;en l&rsquo;absence de parenth\u00e8ses explicites, une clause formul\u00e9e comme suit :<\/p>\n<p><em>WHERE Age &gt;= 65 AND Pathologie CONTAINS &lsquo;Diabete&rsquo; OR Score_Gravite &gt; 10;<\/em><\/p>\n<p>sera implicitement interpr\u00e9t\u00e9e par le compilateur SAS comme :<\/p>\n<p><em>WHERE (Age &gt;= 65 AND Pathologie CONTAINS &lsquo;Diabete&rsquo;) OR Score_Gravite &gt; 10;<\/em><\/p>\n<p>Dans ce sc\u00e9nario, un individu \u00e2g\u00e9 de 20 ans poss\u00e9dant un <em>Score_Gravite<\/em> sup\u00e9rieur \u00e0 10 sera s\u00e9lectionn\u00e9 dans la table de destination, quand bien m\u00eame l&rsquo;intention du statisticien \u00e9tait de restreindre l&rsquo;ensemble de la cohorte aux personnes de 65 ans et plus. Pour \u00e9liminer tout biais d&rsquo;\u00e9valuation, le principe fondamental d&rsquo;ing\u00e9nierie impose le parenth\u00e9sage syst\u00e9matique des blocs bool\u00e9ens afin de mat\u00e9rialiser sans ambigu\u00eft\u00e9 les fronti\u00e8res relationnelles du sous-ensemble vis\u00e9.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/contains3.jpg\" alt=\"\" \/><\/figure>\n<h3>10.2 \u00c9tude de cas syntaxique : croisement de scores num\u00e9riques et de motifs textuels<\/h3>\n<p>Afin de concr\u00e9tiser l&rsquo;application de ces pr\u00e9ceptes, analysons un cas d&rsquo;usage tir\u00e9 de la pharmaco-\u00e9pid\u00e9miologie. L&rsquo;objectif est d&rsquo;isoler au sein d&rsquo;une m\u00e9gabase de suivi hospitalier une sous-cohorte d&rsquo;int\u00e9r\u00eat r\u00e9pondant aux crit\u00e8res stricts suivants :<\/p>\n<ol>\n<li>\u00catre \u00e2g\u00e9 d&rsquo;au moins 50 ans au moment de l&rsquo;admission ;<\/li>\n<li>Pr\u00e9senter un indice de masse corporelle (IMC) valide et strictement sup\u00e9rieur \u00e0 30 ;<\/li>\n<li>Avoir un diagnostic principal ou secondaire mentionnant explicitement une d\u00e9compensation cardiaque ou pulmonaire (insensible \u00e0 la casse) ;<\/li>\n<li>Exclure formellement les dossiers annot\u00e9s d&rsquo;une mention de soins palliatifs ou de fin de vie.<\/li>\n<\/ol>\n<p>La requ\u00eate de s\u00e9lection optimis\u00e9e au niveau de l&rsquo;\u00e9tape DATA s&rsquo;articule ainsi :<\/p>\n<p><em>DATA Cohorte_Etude(DROP=Commentaire_Admission);<br \/>\nSET Base_Nationale_Hospitaliere;<br \/>\nWHERE (Age &gt;= 50)<br \/>\nAND (NOT MISSING(IMC) AND IMC &gt; 30)<br \/>\nAND (FIND(Diagnostic_Texte, &lsquo;decompensation&rsquo;, &lsquo;i&rsquo;) &gt; 0)<br \/>\nAND (FIND(Diagnostic_Texte, &lsquo;cardiaque&rsquo;, &lsquo;i&rsquo;) &gt; 0 OR FIND(Diagnostic_Texte, &lsquo;pulmonaire&rsquo;, &lsquo;i&rsquo;) &gt; 0)<br \/>\nAND (NOT (Diagnostic_Texte CONTAINS &lsquo;PALLIATIF&rsquo; OR Diagnostic_Texte CONTAINS &lsquo;FIN_DE_VIE&rsquo;));<br \/>\nRUN;<\/em><\/p>\n<p>Cette architecture met en exergue une ma\u00eetrise compl\u00e8te des r\u00e8gles de pr\u00e9c\u00e9dence : les crit\u00e8res physiologiques num\u00e9riques forment des blocs \u00e9tanches, la d\u00e9tection des sous-cha\u00eenes cliniques conjugue l&rsquo;insensibilit\u00e9 \u00e0 la casse (modificateur &lsquo;i&rsquo; de FIND) et la composition disjonctive interne, tandis que le volet soustractif est blind\u00e9 par la n\u00e9gation explicite d&rsquo;un bloc regroupant l&rsquo;ensemble des motifs d&rsquo;exclusion. Une telle structure assure la reproductibilit\u00e9 int\u00e9grale de l&rsquo;extraction de donn\u00e9es au sein d&rsquo;un pipeline de validation r\u00e9glementaire.<\/p>\n<h2>11. Application pratique en recherche quantitative et traitement d&rsquo;enqu\u00eates<\/h2>\n<h3>11.1 Analyse de verbatim et r\u00e9ponses ouvertes de questionnaires<\/h3>\n<p>L&rsquo;exploitation empirique des r\u00e9ponses ouvertes (verbatims) dans les enqu\u00eates d&rsquo;opinion ou les protocoles de recherche mixte (qualitative-quantitative) se heurte traditionnellement \u00e0 la plasticit\u00e9 du langage naturel. Les r\u00e9pondants s&rsquo;expriment \u00e0 travers des tournures idiomatiques, des m\u00e9taphores, des fautes lexicales et des constructions syntaxiques asym\u00e9triques. Le filtrage textuel sous SAS fournit l&rsquo;infrastructure fondamentale pour automatiser la th\u00e9matisation de ces corpus bruts.<\/p>\n<p>L&rsquo;approche m\u00e9thodique consiste \u00e0 construire des indicateurs dichotomiques (variables binaires 0\/1) marquant la pr\u00e9sence d&rsquo;univers s\u00e9mantiques pr\u00e9d\u00e9finis, sur la base desquels s&rsquo;op\u00e8re le sous-ensemblement des observations. Par exemple, au sein d&rsquo;une enqu\u00eate explorant l&rsquo;adh\u00e9sion vaccinale, l&rsquo;identification des craintes relatives aux effets secondaires ind\u00e9sirables requiert la recherche d&rsquo;une constellation de racines morphologiques (comme \u00ab secondair \u00bb, \u00ab reaction \u00bb, \u00ab allergie \u00bb, \u00ab risque \u00bb) :<\/p>\n<p><em>DATA Enquete_Thematisee;<br \/>\nSET Enquete_Brute;<br \/>\nFlag_Effet_Secondaire = 0;<br \/>\nIF FIND(Verbatim_Reponse, &lsquo;secondair&rsquo;, &lsquo;i&rsquo;) &gt; 0<br \/>\n   OR FIND(Verbatim_Reponse, &lsquo;reaction&rsquo;, &lsquo;i&rsquo;) &gt; 0<br \/>\n   OR FIND(Verbatim_Reponse, &lsquo;allerg&rsquo;, &lsquo;i&rsquo;) &gt; 0 THEN Flag_Effet_Secondaire = 1;<br \/>\nRUN;<\/em><\/p>\n<p>Une fois cette \u00e9tape de marquage ex\u00e9cut\u00e9e, le sous-ensemble analytique peut \u00eatre g\u00e9n\u00e9r\u00e9 \u00e0 la vol\u00e9e dans des proc\u00e9dures de mod\u00e9lisation statistique, par exemple au moyen d&rsquo;une instruction <em>WHERE Flag_Effet_Secondaire = 1;<\/em> sous PROC LOGISTIC, autorisant l&rsquo;\u00e9tude diff\u00e9rentielle des d\u00e9terminants sociod\u00e9mographiques associ\u00e9s \u00e0 cette crainte sp\u00e9cifique.<\/p>\n<h3>11.2 Standardisation des codes nosologiques et classifications diagnostiques<\/h3>\n<p>Dans le domaine de l&rsquo;informatique m\u00e9dicale et de la recherche en sant\u00e9 publique, les bases de donn\u00e9es mobilisent des terminologies de r\u00e9f\u00e9rence telles que la Classification Internationale des Maladies (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.who.int\/standards\/classifications\/classification-of-diseases\">CIM<\/a>) ou la nomenclature syst\u00e9matique des m\u00e9dicaments. Bien que ces nomenclatures soient th\u00e9oriquement codifi\u00e9es selon des formats alphanum\u00e9riques stricts, leur saisie sur le terrain s&rsquo;accompagne fr\u00e9quemment de pr\u00e9fixes locaux, de suffixes d&rsquo;extension ou d&rsquo;annotations textuelles parasitaires int\u00e9gr\u00e9es dans le m\u00eame champ.<\/p>\n<p>Le filtrage de familles pathologiques compl\u00e8tes requiert l&rsquo;extraction de racines nosologiques communes. Par exemple, au sein de la CIM-10, l&rsquo;ensemble des n\u00e9oplasmes malins de la prostate est codifi\u00e9 sous la racine \u00ab C61 \u00bb. Toutefois, selon les \u00e9tablissements de soins, le code peut appara\u00eetre sous des graphies telles que \u00ab C61 \u00bb, \u00ab C61.9 \u00bb, \u00ab Diagnostic: C61 \u00bb, ou \u00ab Tumeur C61 (primitive) \u00bb. Pour agr\u00e9ger exhaustivement ces donn\u00e9es au sein d&rsquo;un registre \u00e9pid\u00e9miologique, la recherche par sous-cha\u00eene s&rsquo;impose comme la solution canonique :<\/p>\n<p><em>WHERE FIND(Code_CIM10, &lsquo;C61&rsquo;, &lsquo;i&rsquo;) &gt; 0;<\/em><\/p>\n<p>Cependant, le contr\u00f4le qualit\u00e9 exige d&rsquo;\u00e9carter le risque de capter par inadvertance des codes adjacents comme un fictif \u00ab AC61 \u00bb ou un num\u00e9ro d&rsquo;observation hospitali\u00e8re interne \u00ab 12C618 \u00bb. Le recours cibl\u00e9 \u00e0 la fonction <strong>FINDW<\/strong> ou \u00e0 l&rsquo;ancrage via <strong>PRXMATCH<\/strong> (par exemple, <em>&lsquo;\/(^|s)C61(.d+)?(s|$)\/&rsquo;<\/em>) assure une standardisation rigoureuse des cohortes nosologiques, condition sine qua non de la robustesse m\u00e9thodologique des \u00e9tudes d&rsquo;observation en vie r\u00e9elle.<\/p>\n<h2>12. Diagnostic, d\u00e9bogage et bonnes pratiques pour la manipulation de cha\u00eenes<\/h2>\n<h3>12.1 Surveillance du journal d&rsquo;ex\u00e9cution (SAS Log) et d\u00e9tection des anomalies<\/h3>\n<p>Le journal d&rsquo;ex\u00e9cution SAS (SAS Log) constitue le tableau de bord privil\u00e9gi\u00e9 pour v\u00e9rifier l&rsquo;exactitude op\u00e9rationnelle et syntaxique des filtres textuels appliqu\u00e9s. Lors de l&rsquo;ex\u00e9cution d&rsquo;une \u00e9tape DATA ou d&rsquo;une proc\u00e9dure analytique adoss\u00e9e \u00e0 une condition <strong>WHERE<\/strong> ou <strong>IF<\/strong>, le journal consigne syst\u00e9matiquement le nombre d&rsquo;observations lues depuis la table source et le nombre d&rsquo;observations \u00e9crites dans la table de destination.<\/p>\n<p>Une discordance spectaculaire entre la taille th\u00e9orique attendue de la sous-population et le nombre de lignes effectivement s\u00e9lectionn\u00e9es \u2014 par exemple, une table r\u00e9sultante comptabilisant 0 observation \u2014 indique presque syst\u00e9matiquement une d\u00e9faillance dans la formulation du pr\u00e9dicat textuel : conflit de casse, pr\u00e9sence d&rsquo;un espace parasite dans la cha\u00eene litt\u00e9rale recherch\u00e9e, ou confusion entre les connecteurs logiques AND et OR. De plus, il convient de scruter attentivement l&rsquo;apparition de messages d&rsquo;avertissement de type \u00ab NOTE: Character values have been converted to numeric values at the places given by: \u00bb ou l&rsquo;inverse. Ces conversions implicites surviennent fr\u00e9quemment lorsqu&rsquo;un d\u00e9veloppeur omet les guillemets autour d&rsquo;une cha\u00eene compos\u00e9e exclusivement de chiffres, entra\u00eenant une chute drastique des performances et un risque de d\u00e9naturation des donn\u00e9es.<\/p>\n<p>Pour auditer de mani\u00e8re chirurgicale le comportement d&rsquo;un filtre au fil des it\u00e9rations de l&rsquo;\u00e9tape DATA, l&rsquo;instruction <strong>PUTLOG<\/strong> repr\u00e9sente un outil de diagnostic exceptionnel :<\/p>\n<p><em>IF FIND(Libelle_Produit, &lsquo;Critique&rsquo;, &lsquo;i&rsquo;) &gt; 0 THEN DO;<br \/>\n   PUTLOG &lsquo;ATTENTION : Correspondance localis\u00e9e pour ID=&rsquo; Identifiant &lsquo;Valeur brute=&rsquo; Libelle_Produit;<br \/>\nEND;<\/em><\/p>\n<p>Cette trace d&rsquo;ex\u00e9cution permet au statisticien d&rsquo;inspecter visuellement dans le journal la conformit\u00e9 des donn\u00e9es r\u00e9elles ayant d\u00e9clench\u00e9 la s\u00e9lection, facilitant l&rsquo;identification imm\u00e9diate de faux positifs.<\/p>\n<h3>12.2 Strat\u00e9gies de test unitaire et jeux de donn\u00e9es de validation<\/h3>\n<p>L&rsquo;assurance qualit\u00e9 logicielle appliqu\u00e9e \u00e0 la science des donn\u00e9es requiert la mise en \u0153uvre de tests unitaires formels pr\u00e9alablement au d\u00e9ploiement des filtres textuels sur des bases de donn\u00e9es de production. Cette m\u00e9thodologie consiste \u00e0 forger un jeu de donn\u00e9es de test synth\u00e9tique restreint, int\u00e9grant intentionnellement l&rsquo;ensemble des singularit\u00e9s typographiques, des cas limites (edge cases) et des anomalies potentielles susceptibles de polluer les flux r\u00e9els.<\/p>\n<p>Un jeu de donn\u00e9es de validation pour le filtrage textuel doit syst\u00e9matiquement int\u00e9grer :<\/p>\n<ul>\n<li>Des observations comportant la sous-cha\u00eene cible dans diverses configurations de casse (enti\u00e8rement en minuscules, enti\u00e8rement en majuscules, casse mixte) ;<\/li>\n<li>Des cha\u00eenes contenant le motif cible accol\u00e9 \u00e0 d&rsquo;autres caract\u00e8res (mots compos\u00e9s, suffixes, pr\u00e9fixes) pour v\u00e9rifier l&rsquo;absence d&rsquo;inclusion non d\u00e9sir\u00e9e ;<\/li>\n<li>Des enregistrements incluant des espaces superflus (blancs de t\u00eate, espaces doubles au milieu, tabulations) ;<\/li>\n<li>Des observations contenant des valeurs textuelles manquantes pures (cha\u00eenes vides de longueur variable) ;<\/li>\n<li>Des occurrences de cha\u00eenes sp\u00e9ciales int\u00e9grant des caract\u00e8res accentu\u00e9s issus de diff\u00e9rents jeux d&rsquo;encodage (UTF-8 versus Latin-1\/Wlatin1).<\/li>\n<\/ul>\n<p>En confrontant le filtre \u00e0 cet \u00e9chantillon d&rsquo;\u00e9preuve et en mesurant l&rsquo;ad\u00e9quation exacte entre les observations s\u00e9lectionn\u00e9es et la matrice de r\u00e9sultat attendue, le chercheur valide scientifiquement la robustesse de sa syntaxe de s\u00e9lection avant son application \u00e0 grande \u00e9chelle.<\/p>\n<h3>12.3 Recommandations de style et standardisation du code de filtrage<\/h3>\n<p>La p\u00e9rennit\u00e9 des analyses statistiques et la reproductibilit\u00e9 des travaux de recherche d\u00e9pendent directement de la rigueur stylistique adopt\u00e9e dans l&rsquo;\u00e9criture du code source. Un code SAS maintenable doit bannir les raccourcis syntaxiques obscurs au profit de formulations explicites, document\u00e9es et modulaires.<\/p>\n<p>En mati\u00e8re de s\u00e9lection textuelle, l&#8217;emploi de fonctions modernes auto-document\u00e9es comme <strong>FIND<\/strong> (avec explicitation lisible des modificateurs &lsquo;i&rsquo; et &lsquo;t&rsquo;) doit \u00eatre syst\u00e9matiquement privil\u00e9gi\u00e9 par rapport \u00e0 l&rsquo;usage d&rsquo;op\u00e9rateurs cryptiques tels que le point d&rsquo;interrogation (<em>?<\/em>). Les crit\u00e8res de filtrage complexes ne doivent jamais \u00eatre compil\u00e9s sous forme d&rsquo;instructions monolithiques sur une seule ligne ; ils doivent faire l&rsquo;objet d&rsquo;une indentation hi\u00e9rarchique mat\u00e9rialisant visuellement les blocs d&rsquo;\u00e9valuation logique.<\/p>\n<p>Enfin, lorsque des logiques de filtrage textuel r\u00e9currentes sont mobilis\u00e9es \u00e0 travers plusieurs programmes d&rsquo;une m\u00eame organisation, les bonnes pratiques prescrivent leur encapsulation au sein de macros SAS param\u00e9trables :<\/p>\n<p><em>%MACRO FiltrerPathologie(TableSource=, TableCible=, VariableTexte=, Motif=);<br \/>\n   DATA &amp;TableCible.;<br \/>\n      SET &amp;TableSource.;<br \/>\n      WHERE FIND(&amp;VariableTexte., \u00ab\u00a0&amp;Motif.\u00a0\u00bb, &lsquo;it&rsquo;) &gt; 0;<br \/>\n   RUN;<br \/>\n%MEND FiltrerPathologie;<\/em><\/p>\n<p>Cette industrialisation modulaire garantit l&rsquo;application uniforme des standards de d\u00e9tection, \u00e9limine le risque d&rsquo;erreurs de copie manuelle de conditions logiques et s\u00e9curise durablement les processus de traitement analytique dans les organisations scientifiques et d\u00e9cisionnelles.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Allison, P. D. (2010). <em>Logistic regression using SAS: Theory and application<\/em> (2nd ed.). SAS Institute.<\/p>\n<p>Cody, R. (2018). <em>Cody&rsquo;s data cleaning techniques using SAS<\/em> (3rd ed.). SAS Institute.<\/p>\n<p>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The little SAS book: A primer<\/em> (6th ed.). SAS Institute.<\/p>\n<p>Horstman, D. W. (2017). <em>Methods for searching, matching, and replacing text in SAS: From simple functions to Perl regular expressions<\/em>. In Proceedings of the SAS Global Forum 2017 Conference. SAS Institute. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/resources\/papers\/proceedings17\/0413-2017.pdf\">https:\/\/support.sas.com\/resources\/papers\/proceedings17\/0413-2017.pdf<\/a><\/p>\n<p>Li, A. (2013). <em>Character string processing using SAS functions: INDEX, FIND, and beyond<\/em>. In Proceedings of the Western Users of SAS Software (WUSS) Conference. WUSS. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.lexjansen.com\/wuss\/2013\/68_Paper.pdf\">https:\/\/www.lexjansen.com\/wuss\/2013\/68_Paper.pdf<\/a><\/p>\n<p>SAS Institute Inc. (2020). <em>SAS 9.4 Language reference: Concepts<\/em> (6th ed.). SAS Institute. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lepg\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lepg\/titlepage.htm<\/a><\/p>\n<p>SAS Institute Inc. (2021). <em>SAS 9.4 Functions and CALL routines: Reference<\/em> (5th ed.). SAS Institute. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/ledirref\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/ledirref\/titlepage.htm<\/a><\/p>\n<p>Torfason, E. (2014). <em>Working with regular expressions in SAS: PRX functions in practice<\/em>. In Proceedings of the PharmaSUG 2014 Conference. PharmaSUG. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.lexjansen.com\/pharmasug\/2014\/BB\/PharmaSUG-2014-BB16.pdf\">https:\/\/www.lexjansen.com\/pharmasug\/2014\/BB\/PharmaSUG-2014-BB16.pdf<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour filtrer des observations selon des crit\u00e8res textuels dans SAS : op\u00e9rateurs CONTAINS, IN, fonctions FIND et expressions r\u00e9guli\u00e8res.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[4055,10233,10234,10232,235],"class_list":["post-9310","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-filtrage-de-donnees","tag-instruction-where","tag-manipulation-de-chaines","tag-operateur-contains","tag-sas"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9310","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=9310"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9310\/revisions"}],"predecessor-version":[{"id":9315,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9310\/revisions\/9315"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}