{"id":9871,"date":"2026-10-14T18:02:34","date_gmt":"2026-10-14T18:02:34","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-utiliser-fonction-find-sas-exemples\/"},"modified":"2026-10-14T18:02:34","modified_gmt":"2026-10-14T18:02:34","slug":"comment-utiliser-fonction-find-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-utiliser-fonction-find-sas-exemples","title":{"rendered":"Comment utiliser la fonction FIND dans SAS (avec exemples)"},"content":{"rendered":"<p>Dans l&rsquo;\u00e9cosyst\u00e8me de l&rsquo;ing\u00e9nierie des donn\u00e9es et de l&rsquo;analyse biostatistique, le traitement des variables alphanum\u00e9riques constitue un d\u00e9fi perp\u00e9tuel d&rsquo;une complexit\u00e9 souvent sous-estim\u00e9e. Bien que le langage SAS (Statistical Analysis System) ait initialement b\u00e2ti sa r\u00e9putation sur ses capacit\u00e9s exceptionnelles de calcul matriciel, de mod\u00e9lisation stochastique et de manipulation de donn\u00e9es tabulaires massives, l&rsquo;explosion des sources textuelles non structur\u00e9es \u2014 telles que les comptes rendus cliniques, les journaux d&rsquo;\u00e9v\u00e9nements informatiques, les codifications nosologiques et les donn\u00e9es d&rsquo;enqu\u00eates qualitatives \u2014 a impos\u00e9 le d\u00e9veloppement d&rsquo;outils textuels d&rsquo;une pr\u00e9cision chirurgicale. La capacit\u00e9 \u00e0 interroger, segmenter et auditer des cha\u00eenes de caract\u00e8res sans corrompre l&rsquo;int\u00e9grit\u00e9 des vecteurs sous-jacents repr\u00e9sente une comp\u00e9tence fondamentale pour tout statisticien ou architecte de donn\u00e9es op\u00e9rant dans des environnements r\u00e9glement\u00e9s.<\/p>\n<p>Au c\u0153ur de cette bo\u00eete \u00e0 outils algorithmique r\u00e9side la fonction <strong>FIND<\/strong> de SAS. Introduite pour moderniser, unifier et supplanter des fonctions historiques plus rigides telles qu&rsquo;INDEX, la fonction FIND s&rsquo;impose comme un standard d&rsquo;excellence pour la localisation scalaire de sous-cha\u00eenes. Con\u00e7ue pour offrir une flexibilit\u00e9 param\u00e9trique maximale, elle permet aux d\u00e9veloppeurs de naviguer au sein de corpus textuels h\u00e9t\u00e9rog\u00e8nes en combinant le contr\u00f4le bidirectionnel du balayage, l&rsquo;insensibilit\u00e9 configurable \u00e0 la casse typographique et la neutralisation dynamique des espaces superflus. Cette fonction ne se contente pas de r\u00e9pondre \u00e0 la question binaire de la pr\u00e9sence d&rsquo;un motif ; elle renvoie l&rsquo;exacte coordonn\u00e9e ordinale de son occurrence, ouvrant ainsi la voie \u00e0 des op\u00e9rations sophistiqu\u00e9es d&rsquo;extraction, de d\u00e9coupage et de nettoyage automatis\u00e9.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur l&rsquo;ensemble des m\u00e9canismes r\u00e9gissant la fonction FIND dans SAS. En adoptant une perspective \u00e0 la fois th\u00e9orique, syntaxique et r\u00e9solument pragmatique, nous explorerons ses fondations algorithmiques, diss\u00e9querons ses param\u00e8tres formels, \u00e9tudierons son comportement face aux anomalies structurelles de donn\u00e9es et exposerons des protocoles d&rsquo;impl\u00e9mentation industrielle. \u00c0 travers des d\u00e9monstrations empiriques rigoureuses et des comparaisons architecturales d\u00e9taill\u00e9es avec les fonctions connexes du syst\u00e8me SAS, cet article fournira aux praticiens les connaissances requises pour concevoir des programmes p\u00e9rennes, hautement optimis\u00e9s et conformes aux exigences de la science des donn\u00e9es contemporaine.<\/p>\n<h2>1. Introduction \u00e0 la manipulation de cha\u00eenes de caract\u00e8res et \u00e0 la fonction FIND dans SAS<\/h2>\n<h3>1.1 R\u00f4le fondamental de l&rsquo;analyse textuelle dans l&rsquo;environnement SAS<\/h3>\n<p>L&rsquo;exploitation de m\u00e9gadonn\u00e9es au sein des infrastructures d\u00e9cisionnelles contemporaines confronte in\u00e9vitablement les analystes \u00e0 une pr\u00e9pond\u00e9rance croissante de variables textuelles. Qu&rsquo;il s&rsquo;agisse de variables cat\u00e9gorielles mal standardis\u00e9es, de descripteurs nosologiques issus de la classification internationale des maladies, ou de flux continus de m\u00e9tadonn\u00e9es de t\u00e9l\u00e9m\u00e9trie, la cha\u00eene de caract\u00e8res demeure le v\u00e9hicule primaire de l&rsquo;information brute. Dans l&rsquo;\u00e9cosyst\u00e8me <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS<\/a>, r\u00e9put\u00e9 pour sa pr\u00e9\u00e9minence dans l&rsquo;industrie pharmaceutique, le secteur bancaire et les administrations publiques, le traitement rigoureux de ces donn\u00e9es textuelles constitue une obligation m\u00e9thodologique majeure. L&rsquo;analyse textuelle ne se r\u00e9sume pas \u00e0 une simple commodit\u00e9 de mise en forme ; elle conditionne la validit\u00e9 des jointures relationnelles, l&rsquo;exactitude du codage des variables d&rsquo;exposition et la pertinence des cohortes constitu\u00e9es pour les analyses inf\u00e9rentielles ult\u00e9rieures.<\/p>\n<p>La manipulation de volumes colossaux de donn\u00e9es textuelles requiert des algorithmes capables de sonder des millions d&rsquo;enregistrements avec un co\u00fbt d&rsquo;ex\u00e9cution minimal. La recherche de motifs sp\u00e9cifiques \u2014 qu&rsquo;il s&rsquo;agisse d&rsquo;un pr\u00e9fixe d&rsquo;identification, d&rsquo;un biomarqueur dans une cha\u00eene d&rsquo;acides amin\u00e9s, ou d&rsquo;un terme diagnostique au sein d&rsquo;une observation m\u00e9dicale \u2014 exige des fonctions analytiques non destructives. Ces outils doivent imp\u00e9rativement inspecter le contenu du vecteur alphanum\u00e9rique sans en alt\u00e9rer la structure, la longueur d\u00e9clar\u00e9e ou les attributs d&rsquo;encodage sous-jacents. Dans ce contexte, SAS se positionne comme une r\u00e9f\u00e9rence absolue, fournissant un moteur d&rsquo;ex\u00e9cution d\u00e9terministe capable de traiter les cha\u00eenes de caract\u00e8res avec une constance math\u00e9matique et une neutralit\u00e9 fonctionnelle garantissant la reproductibilit\u00e9 scientifique des traitements appliqu\u00e9s.<\/p>\n<h3>1.2 D\u00e9finition conceptuelle et objectif de la fonction FIND<\/h3>\n<p>D&rsquo;un point de vue conceptuel, la fonction FIND est un op\u00e9rateur scalaire d&rsquo;inspection textuelle con\u00e7u pour d\u00e9terminer la position g\u00e9ographique d&rsquo;une s\u00e9quence de caract\u00e8res \u2014 commun\u00e9ment appel\u00e9e sous-cha\u00eene ou motif \u2014 \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une s\u00e9quence textuelle plus vaste, d\u00e9sign\u00e9e comme cha\u00eene h\u00f4te ou cha\u00eene source. Contrairement aux fonctions d&rsquo;extraction telles que SUBSTR ou aux fonctions de substitution comme TRANWRD ou REGEXPREP, la fonction FIND n&rsquo;op\u00e8re aucune mutation sur la m\u00e9moire allou\u00e9e au texte source. Son mandat algorithmique unique consiste \u00e0 balayer la cha\u00eene cible afin de localiser la premi\u00e8re unit\u00e9 lexicale correspondant exactement aux crit\u00e8res d\u00e9finis par l&rsquo;utilisateur, puis de restituer cette coordonn\u00e9e sous la forme d&rsquo;un nombre entier positif.<\/p>\n<p>L&rsquo;indice retourn\u00e9 par la fonction FIND correspond pr\u00e9cis\u00e9ment au num\u00e9ro d&rsquo;ordre du premier caract\u00e8re de la sous-cha\u00eene d\u00e9tect\u00e9e. Si le motif recherch\u00e9 n&rsquo;existe pas au sein du segment textuel balay\u00e9, ou si les contraintes impos\u00e9es par les param\u00e8tres optionnels ne peuvent \u00eatre satisfaites, la fonction renvoie invariablement la valeur z\u00e9ro. Cette dichotomie math\u00e9matique entre un indice strictement positif et la valeur z\u00e9ro conf\u00e8re \u00e0 la fonction une double utilit\u00e9 : elle sert simultan\u00e9ment d&rsquo;outil de mesure d&rsquo;offset pour les d\u00e9coupages dynamiques ult\u00e9rieurs et de pr\u00e9dicat logique au sein des structures d\u00e9cisionnelles conditionnelles. Cette s\u00e9paration claire entre d\u00e9tection de position et alt\u00e9ration de contenu constitue le fondement d&rsquo;une programmation d\u00e9fensive et hautement modulable.<\/p>\n<h3>1.3 Syst\u00e8me d&rsquo;indexation SAS \u00e0 base 1<\/h3>\n<p>L&rsquo;une des sp\u00e9cificit\u00e9s techniques primordiales du langage SAS r\u00e9side dans l&rsquo;adoption rigoureuse d&rsquo;un syst\u00e8me d&rsquo;indexation bas\u00e9 sur l&rsquo;entier 1 (indexation \u00e0 base 1 ou <em>1-based indexing<\/em>). Contrairement \u00e0 de nombreux langages informatiques issus de la tradition du C, tels que Python, Java ou C++, o\u00f9 le premier \u00e9l\u00e9ment d&rsquo;une cha\u00eene ou d&rsquo;un tableau est r\u00e9f\u00e9renc\u00e9 par l&rsquo;indice 0 en vertu de calculs d&rsquo;adresses m\u00e9moires relatives, SAS aborde l&rsquo;indexation selon une s\u00e9mantique ordinale directe. Le tout premier caract\u00e8re situ\u00e9 \u00e0 l&rsquo;extr\u00eame gauche d&rsquo;une variable de type caract\u00e8re occupe donc la position num\u00e9ro 1. Cette convention conceptuelle simplifie l&rsquo;interpr\u00e9tation s\u00e9mantique pour les statisticiens et analystes de donn\u00e9es, mais impose une vigilance constante aux d\u00e9veloppeurs polyglottes habitu\u00e9s aux arithm\u00e9tiques de pointeurs \u00e0 d\u00e9calage nul.<\/p>\n<p>Cette indexation \u00e0 base 1 a des cons\u00e9quences directes sur les algorithmes d&rsquo;analyse s\u00e9quentielle. Lorsqu&rsquo;un motif de recherche est identifi\u00e9 imm\u00e9diatement au d\u00e9but de la variable analys\u00e9e, la fonction FIND retourne la valeur 1. Par voie de cons\u00e9quence, le r\u00e9sultat num\u00e9rique 0 ne saurait en aucun cas d\u00e9signer le d\u00e9but de la cha\u00eene ; il est universellement et exclusivement r\u00e9serv\u00e9 par le compilateur SAS pour signaler l&rsquo;\u00e9chec de la recherche, c&rsquo;est-\u00e0-dire l&rsquo;absence stricte de la sous-cha\u00eene au sein de la plage d&rsquo;inspection. Cette distinction absolue \u00e9limine toute ambigu\u00eft\u00e9 lors de l&rsquo;\u00e9valuation logique dans un bloc DATA : un r\u00e9sultat sup\u00e9rieur \u00e0 z\u00e9ro s&rsquo;\u00e9value syst\u00e9matiquement comme un \u00e9tat de v\u00e9rit\u00e9 bool\u00e9enne, tandis que le r\u00e9sultat z\u00e9ro correspond formellement \u00e0 un \u00e9tat de fausset\u00e9.<\/p>\n<h2>2. Syntaxe formelle et anatomie des param\u00e8tres de la fonction FIND<\/h2>\n<h3>2.1 Signature exhaustive de l&rsquo;instruction<\/h3>\n<p>La mise en \u0153uvre de la fonction FIND ob\u00e9it \u00e0 un formalisme syntaxique rigoureux d\u00e9fini au sein du moteur d&rsquo;ex\u00e9cution SAS. La signature exhaustive de cette fonction s&rsquo;articule autour de quatre arguments positionnels distincts, dont deux sont obligatoires et deux sont optionnels. La forme canonique de l&rsquo;instruction s&rsquo;exprime de la fa\u00e7on suivante dans le langage du compilateur :<\/p>\n<p><strong>FIND(string, substring &lt;, modifiers&gt; &lt;, startpos&gt;)<\/strong><\/p>\n<p>Dans cette formulation param\u00e9trique, les chevrons typographiques soulignent la nature facultative des arguments situ\u00e9s en troisi\u00e8me et quatri\u00e8me position. La pr\u00e9sence imp\u00e9rative des deux premiers param\u00e8tres constitue le socle minimal permettant l&rsquo;instanciation de l&rsquo;algorithme de balayage. L&rsquo;ajout des param\u00e8tres subsidiaires permet d&rsquo;alt\u00e9rer dynamiquement le comportement du comparateur d&rsquo;octets sans qu&rsquo;il soit n\u00e9cessaire d&rsquo;encapsuler la variable d&rsquo;origine dans des fonctions de conversion annexes. Cette architecture modulaire garantit une expressivit\u00e9 maximale tout en pr\u00e9servant une concision appr\u00e9ciable du code source, limitant ainsi la surcharge cognitive lors des phases d&rsquo;audit et de maintenance applicative.<\/p>\n<h3>2.2 Caract\u00e9risation de l&rsquo;argument source (string)<\/h3>\n<p>Le premier argument, conventionnellement d\u00e9sign\u00e9 par le terme g\u00e9n\u00e9rique <em>string<\/em>, constitue la mati\u00e8re premi\u00e8re sur laquelle s&rsquo;ex\u00e9cute le processus d&rsquo;inspection. Cet argument accepte une grande diversit\u00e9 d&rsquo;entit\u00e9s lexicales au sein de l&rsquo;\u00e9tape DATA ou des proc\u00e9dures compatibles. Il peut s&rsquo;agir, en premier lieu, d&rsquo;une variable de type caract\u00e8re formellement d\u00e9clar\u00e9e et issue d&rsquo;une table SAS sous-jacente ou instanci\u00e9e dynamiquement dans le vecteur de donn\u00e9es du programme (Program Data Vector &#8211; PDV). La longueur de cette variable peut s&rsquo;\u00e9tendre de 1 octet jusqu&rsquo;aux limites maximales allou\u00e9es par l&rsquo;architecture du syst\u00e8me, soit 32 767 octets pour les environnements SAS traditionnels sous Windows et Unix.<\/p>\n<p>En second lieu, l&rsquo;argument source peut \u00eatre mat\u00e9rialis\u00e9 sous la forme d&rsquo;une constante litt\u00e9rale, c&rsquo;est-\u00e0-dire une cha\u00eene textuelle brute rigoureusement encadr\u00e9e par des apostrophes simples ou des guillemets doubles. Enfin, le compilateur SAS autorise l&rsquo;imbrication d&rsquo;expressions complexes en lieu et place d&rsquo;une r\u00e9f\u00e9rence directe \u00e0 une variable. Cela implique que l&rsquo;argument <em>string<\/em> peut r\u00e9sulter de l&rsquo;\u00e9valuation pr\u00e9alable d&rsquo;une fonction de concat\u00e9nation telle que CATX, d&rsquo;une op\u00e9ration de nettoyage pr\u00e9alable, ou encore d&rsquo;une r\u00e9solution macro-analytique complexe. Le moteur SAS proc\u00e8de d&rsquo;abord \u00e0 l&rsquo;\u00e9valuation int\u00e9grale de cette expression matricielle avant de transmettre la s\u00e9quence d&rsquo;octets finale au sous-syst\u00e8me de balayage de la fonction FIND.<\/p>\n<h3>2.3 Sp\u00e9cification de la sous-cha\u00eene cible (substring)<\/h3>\n<p>Le second argument, d\u00e9sign\u00e9 sous le vocable <em>substring<\/em>, mat\u00e9rialise l&rsquo;entit\u00e9 textuelle exacte dont le programmeur cherche \u00e0 d\u00e9terminer l&rsquo;occurrence spatiale. Tout comme la cha\u00eene h\u00f4te, cette sous-cha\u00eene cible peut \u00eatre sp\u00e9cifi\u00e9e par l&rsquo;interm\u00e9diaire d&rsquo;une variable alphanum\u00e9rique d\u00e9di\u00e9e ou d&rsquo;une constante litt\u00e9rale textuelle. La granularit\u00e9 de cette cible s&rsquo;\u00e9tend du caract\u00e8re unique isol\u00e9 \u2014 tel qu&rsquo;un symbole de d\u00e9limitation, un signe de ponctuation ou une lettre sp\u00e9cifique \u2014 jusqu&rsquo;\u00e0 des phrases complexes ou des s\u00e9quences de caract\u00e8res alphanum\u00e9riques multi-octets caract\u00e9ristiques des encodages contemporains.<\/p>\n<p>Un aspect crucial de la sp\u00e9cification de cet argument r\u00e9side dans la gestion des longueurs respectives des entit\u00e9s en pr\u00e9sence. D&rsquo;un point de vue algorithmique, si la cha\u00eene cible <em>substring<\/em> poss\u00e8de une longueur strictement sup\u00e9rieure \u00e0 celle de la cha\u00eene h\u00f4te <em>string<\/em> soumise \u00e0 l&rsquo;analyse, la fonction FIND court-circuite imm\u00e9diatement le balayage sans g\u00e9n\u00e9rer d&rsquo;erreur fatale dans le journal d&rsquo;ex\u00e9cution (LOG). Constatant l&rsquo;impossibilit\u00e9 math\u00e9matique d&rsquo;une inclusion spatiale, le moteur d&rsquo;ex\u00e9cution retourne imm\u00e9diatement la valeur enti\u00e8re 0. De surcro\u00eet, le compilateur analyse minutieusement les octets constitutifs de la sous-cha\u00eene en respectant scrupuleusement la s\u00e9quence d&rsquo;encha\u00eenement des caract\u00e8res, ce qui signifie que l&rsquo;ordre et la continuit\u00e9 spatiale des symboles constituent une contrainte stricte lors de l&rsquo;op\u00e9ration de mise en correspondance.<\/p>\n<h2>3. Gestion de la sensibilit\u00e9 \u00e0 la casse et exploration des modificateurs<\/h2>\n<h3>3.1 Comportement par d\u00e9faut : la sensibilit\u00e9 stricte \u00e0 la casse<\/h3>\n<p>Par d\u00e9faut, la fonction FIND applique une strat\u00e9gie d&rsquo;\u00e9valuation binaire rigoureusement asservie \u00e0 la table d&rsquo;encodage du syst\u00e8me h\u00f4te, g\u00e9n\u00e9ralement r\u00e9gie par les standards ASCII ou EBCDIC selon l&rsquo;architecture mat\u00e9rielle sous-jacente. Cette approche implique une sensibilit\u00e9 stricte \u00e0 la casse (<em>case sensitivity<\/em>). En vertu de ce m\u00e9canisme natif, chaque glyphe est identifi\u00e9 par sa valeur binaire sous-jacente : par cons\u00e9quent, la lettre majuscule &lsquo;A&rsquo; (code ASCII d\u00e9cimal 65) est trait\u00e9e comme une entit\u00e9 fondamentalement distincte de la lettre minuscule &lsquo;a&rsquo; (code ASCII d\u00e9cimal 97). Ce comportement d\u00e9terministe est indispensable lors de l&rsquo;analyse de donn\u00e9es techniques structur\u00e9es o\u00f9 la casse porte une signification s\u00e9miotique pr\u00e9cise, comme dans le cas des identifiants d&rsquo;\u00e9chantillons ou des cl\u00e9s de chiffrement.<\/p>\n<p>Cependant, dans le domaine de la science des donn\u00e9es appliqu\u00e9es et de l&rsquo;int\u00e9gration de donn\u00e9es textuelles non assainies, cette sensibilit\u00e9 stricte constitue une source majeure d&rsquo;erreurs de faux n\u00e9gatifs. Par exemple, si l&rsquo;on tente de localiser le mot &lsquo;fox&rsquo; au sein d&rsquo;une variable textuelle contenant la s\u00e9quence &lsquo;The Quick Fox&rsquo;, l&rsquo;impl\u00e9mentation basique de la fonction FIND \u00e9chouera syst\u00e9matiquement et renverra la valeur 0. L&rsquo;analyste non averti pourrait alors d\u00e9duire \u00e0 tort l&rsquo;absence du concept recherch\u00e9, alors que la discordance d\u00e9coule purement d&rsquo;une divergence typographique introduite lors de la saisie humaine des donn\u00e9es.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/findsas1.jpg\" alt=\"\" \/><\/figure>\n<h3>3.2 Le modificateur &lsquo;i&rsquo; : d\u00e9sactivation de la sensibilit\u00e9 \u00e0 la casse<\/h3>\n<p>Afin de pallier les limitations structurelles induites par la sensibilit\u00e9 stricte \u00e0 la casse sans obliger les d\u00e9veloppeurs \u00e0 multiplier les \u00e9tapes interm\u00e9diaires de transformation, les concepteurs du langage SAS ont dot\u00e9 la fonction FIND d&rsquo;un argument modificateur optionnel. Positionn\u00e9 en troisi\u00e8me position dans la signature de la fonction, le caract\u00e8re litt\u00e9ral &lsquo;i&rsquo; (pour <em>ignore case<\/em>) intime l&rsquo;ordre au moteur de recherche textuelle de neutraliser toute distinction entre minuscules et majuscules au cours du processus d&rsquo;\u00e9valuation comparative.<\/p>\n<p>D&rsquo;un point de vue architectural, l&rsquo;adjonction de ce modificateur &lsquo;i&rsquo; ne modifie pas les donn\u00e9es stock\u00e9es en m\u00e9moire physique. SAS proc\u00e8de \u00e0 une normalisation dynamique \u00e0 la vol\u00e9e des octets compar\u00e9s au moment pr\u00e9cis de l&rsquo;ex\u00e9cution du balayage. Ainsi, les graphies &lsquo;FOX&rsquo;, &lsquo;Fox&rsquo;, &lsquo;fOx&rsquo; ou &lsquo;fox&rsquo; sont toutes transitoirement align\u00e9es sur une repr\u00e9sentation uniforme dans les registres du processeur, permettant une identification spatiale infaillible du motif. Cette approche \u00e9vite le recours ancestral qui consistait \u00e0 encapsuler les variables dans les fonctions UPCASE ou LOWCASE, optimisant de ce fait les cycles d&rsquo;instructions du processeur et \u00e9purant drastiquement la syntaxe des scripts analytiques.<\/p>\n<h3>3.3 Modificateurs compl\u00e9mentaires et cumulatifs<\/h3>\n<p>Au-del\u00e0 de la gestion de la casse typographique, la fonction FIND int\u00e8gre d&rsquo;autres modificateurs destin\u00e9s \u00e0 affiner les conditions d&rsquo;ex\u00e9cution du balayage textuel. Parmi ceux-ci, le modificateur &lsquo;t&rsquo; (pour <em>trim<\/em>) occupe une place pr\u00e9pond\u00e9rante dans les environnements de production. Dans le syst\u00e8me SAS, les variables de type caract\u00e8re poss\u00e8dent intrins\u00e8quement une longueur fixe et pr\u00e9d\u00e9termin\u00e9e, ce qui implique que tout espace non utilis\u00e9 \u00e0 la fin d&rsquo;une cha\u00eene est automatiquement combl\u00e9 par des espaces blancs de remplissage (<em>trailing blanks<\/em>). Si une sous-cha\u00eene cible provient d&rsquo;une variable de longueur sup\u00e9rieure au texte r\u00e9el qu&rsquo;elle h\u00e9berge, la recherche standard cherchera \u00e0 faire correspondre le texte suivi de tous ses espaces terminaux, aboutissant quasi-invariablement \u00e0 un \u00e9chec de d\u00e9tection.<\/p>\n<p>L&rsquo;introduction du modificateur &lsquo;t&rsquo; ordonne au compilateur d&rsquo;\u00e9laguer algorithmiquement les espaces de fin de la sous-cha\u00eene cible avant d&rsquo;initier la proc\u00e9dure de localisation. De surcro\u00eet, le moteur SAS autorise la combinaison cumulative de plusieurs modificateurs au sein de la m\u00eame cha\u00eene d&rsquo;arguments. Il est ainsi parfaitement licite et recommand\u00e9 d&rsquo;agr\u00e9ger les comportements en sp\u00e9cifiant la cha\u00eene litt\u00e9rale &lsquo;it&rsquo; ou &lsquo;ti&rsquo; comme troisi\u00e8me param\u00e8tre de la fonction. Le compilateur analyse cette cha\u00eene de param\u00e8tres sans tenir compte de l&rsquo;ordre d&rsquo;\u00e9num\u00e9ration des lettres de modification et active conjointement l&rsquo;insensibilit\u00e9 \u00e0 la casse et la suppression des blancs r\u00e9siduels, dotant ainsi la fonction FIND d&rsquo;une robustesse maximale face aux imperfections de structure textuelle.<\/p>\n<h2>4. Contr\u00f4le de la position de d\u00e9part avec l&rsquo;argument startpos<\/h2>\n<h3>4.1 Recherche directionnelle avant (startpos positif)<\/h3>\n<p>Le quatri\u00e8me param\u00e8tre de la fonction FIND, formellement d\u00e9sign\u00e9 par l&rsquo;expression <em>startpos<\/em>, conf\u00e8re au d\u00e9veloppeur la ma\u00eetrise temporelle et spatiale du balayage textuel en d\u00e9signant le point d&rsquo;ancrage exact \u00e0 partir duquel l&rsquo;inspection doit d\u00e9buter. Par d\u00e9faut, en l&rsquo;absence de ce param\u00e8tre, SAS commence syst\u00e9matiquement son analyse \u00e0 partir du tout premier octet de la cha\u00eene h\u00f4te, soit l&rsquo;indice ordinal 1. Toutefois, la transmission d&rsquo;une valeur enti\u00e8re positive strictement sup\u00e9rieure \u00e0 1 reconfigure instantan\u00e9ment le curseur initial du compilateur.<\/p>\n<p>Lorsqu&rsquo;un argument <em>startpos<\/em> strictement positif est fourni, l&rsquo;algorithme ignore superbement l&rsquo;ensemble des octets positionn\u00e9s en amont de cette coordonn\u00e9e g\u00e9ographique. La recherche s&rsquo;effectue alors selon une trajectoire directionnelle avant classique, progressant de gauche \u00e0 droite, depuis l&rsquo;indice d\u00e9sign\u00e9 jusqu&rsquo;\u00e0 la terminaison de la cha\u00eene. Il importe de souligner avec la plus grande rigueur math\u00e9matique que l&rsquo;indice de position finalement renvoy\u00e9 par la fonction demeure absolu : le r\u00e9sultat correspond \u00e0 la coordonn\u00e9e calcul\u00e9e depuis le d\u00e9but universel de la cha\u00eene h\u00f4te, et non \u00e0 un d\u00e9calage relatif comptabilis\u00e9 \u00e0 partir du point <em>startpos<\/em>. Cette constance d&rsquo;indexation pr\u00e9vient les erreurs de calcul d&rsquo;offset lors de manipulations textuelles imbriqu\u00e9es.<\/p>\n<h3>4.2 Recherche r\u00e9trograde ou invers\u00e9e (startpos n\u00e9gatif)<\/h3>\n<p>L&rsquo;une des fonctionnalit\u00e9s les plus puissantes et m\u00e9connues de la fonction FIND r\u00e9side dans sa capacit\u00e9 \u00e0 op\u00e9rer un balayage r\u00e9trograde ou invers\u00e9 \u00e0 travers la cha\u00eene de donn\u00e9es. Cette modalit\u00e9 op\u00e9rationnelle est instanci\u00e9e d\u00e8s lors que le d\u00e9veloppeur affecte une valeur enti\u00e8re n\u00e9gative \u00e0 l&rsquo;argument <em>startpos<\/em>. Dans cette configuration, le signe n\u00e9gatif n&rsquo;est pas interpr\u00e9t\u00e9 comme une position g\u00e9om\u00e9trique relative par rapport \u00e0 la fin du texte, mais agit comme un commutateur de flux vectoriel : il indique au compilateur qu&rsquo;il doit changer le sens de lecture et parcourir la cha\u00eene de la droite vers la gauche.<\/p>\n<p>Concr\u00e8tement, la valeur absolue de ce param\u00e8tre n\u00e9gatif \u2014 not\u00e9e math\u00e9matiquement |startpos| \u2014 d\u00e9termine la borne spatiale la plus avanc\u00e9e \u00e0 partir de laquelle s&rsquo;enclenche la recherche r\u00e9trograde. L&rsquo;algorithme se positionne sur cet indice absolu, puis examine les s\u00e9quences d&rsquo;octets ant\u00e9rieures en se d\u00e9pla\u00e7ant progressivement vers la gauche, c&rsquo;est-\u00e0-dire vers l&rsquo;indice 1. Ce m\u00e9canisme s&rsquo;av\u00e8re providentiel pour identifier la <em>derni\u00e8re<\/em> occurrence d&rsquo;un d\u00e9limiteur, tel qu&rsquo;un slash dans une arborescence de r\u00e9pertoires ou un point d&rsquo;extension dans un nom de fichier complexe. Bien que le parcours s&rsquo;effectue \u00e0 rebours, l&rsquo;indice retourn\u00e9 demeure, l\u00e0 encore, strictement absolu et index\u00e9 depuis l&rsquo;extr\u00e9mit\u00e9 gauche de la cha\u00eene source.<\/p>\n<h3>4.3 Gestion des cas limites li\u00e9s \u00e0 la position de d\u00e9part<\/h3>\n<p>L&rsquo;utilisation de l&rsquo;argument <em>startpos<\/em> introduit un espace d&rsquo;\u00e9tats limites que le programmeur SAS doit imp\u00e9rativement anticiper afin de pr\u00e9venir les anomalies silencieuses d&rsquo;ex\u00e9cution. Si la valeur absolue de l&rsquo;argument <em>startpos<\/em> exc\u00e8de strictement la longueur mat\u00e9rielle r\u00e9elle de la cha\u00eene h\u00f4te (longueur d\u00e9finie par la fonction LENGTH), le moteur d&rsquo;ex\u00e9cution interrompt imm\u00e9diatement l&rsquo;algorithme sans lever d&rsquo;exception bloquante. Il consigne un avertissement dans les sc\u00e9narios extr\u00eames, mais renvoie principalement la valeur z\u00e9ro pour indiquer qu&rsquo;aucune correspondance ne peut logiquement r\u00e9sulter d&rsquo;une tentative d&rsquo;inspection en dehors des fronti\u00e8res de l&rsquo;objet textuel.<\/p>\n<p>En revanche, la transmission d&rsquo;une valeur num\u00e9rique \u00e9gale \u00e0 0 pour le param\u00e8tre <em>startpos<\/em> est formellement prohib\u00e9e par la grammaire de SAS. \u00c9tant donn\u00e9 que le syst\u00e8me s&rsquo;articule autour d&rsquo;une indexation \u00e0 base 1, la coordonn\u00e9e 0 est inexistante dans la topologie des cha\u00eenes. Une telle tentative d\u00e9clenche l&rsquo;affichage d&rsquo;un message d&rsquo;erreur explicite dans le journal d&rsquo;ex\u00e9cution (LOG) et force la variable r\u00e9ceptrice \u00e0 prendre une valeur num\u00e9rique manquante (<em>missing value<\/em>, repr\u00e9sent\u00e9e par un point &lsquo;.&rsquo;). Enfin, il convient de rappeler une contrainte syntaxique imp\u00e9rative : pour pouvoir sp\u00e9cifier l&rsquo;argument <em>startpos<\/em> tout en conservant le comportement par d\u00e9faut de sensibilit\u00e9 \u00e0 la casse, le programmeur doit obligatoirement renseigner le troisi\u00e8me param\u00e8tre par une cha\u00eene vide mat\u00e9rialis\u00e9e par deux guillemets successifs sans espace, sous la forme FIND(string, substring, \u00a0\u00bb, startpos).<\/p>\n<h2>5. Mise en place d&rsquo;un protocole exp\u00e9rimental : le jeu de donn\u00e9es d&rsquo;exemple<\/h2>\n<h3>5.1 Construction de la table originale via l&rsquo;\u00e9tape DATA<\/h3>\n<p>Pour fonder notre \u00e9tude sur des bases empiriques solides et transparentes, nous devons \u00e9riger un environnement de test standardis\u00e9 au moyen d&rsquo;une \u00e9tape DATA d\u00e9terministe. Cette d\u00e9marche m\u00e9thodologique garantit la parfaite reproductibilit\u00e9 des calculs et permet d&rsquo;observer sans ambigu\u00eft\u00e9 les r\u00e9actions de l&rsquo;interpr\u00e9teur SAS face \u00e0 diverses typologies de structures textuelles. Nous construisons une table SAS de r\u00e9f\u00e9rence, d\u00e9sign\u00e9e conventionnellement sous l&rsquo;identifiant <em>original_data<\/em>, qui encapsule une collection de donn\u00e9es textuelles soigneusement calibr\u00e9es.<\/p>\n<p>Dans ce protocole, la variable textuelle soumise \u00e0 nos analyses d&rsquo;offset sera nomm\u00e9e <em>phrase<\/em>. Afin d&rsquo;\u00e9viter toute troncature subreptice des cha\u00eenes lors de l&rsquo;allocation initiale par le compilateur, une instruction d\u00e9clarative LENGTH doit \u00eatre syst\u00e9matiquement stipul\u00e9e en amont de toute assignation lexicale. L&rsquo;utilisation du bloc d&rsquo;instructions de saisie en ligne DATALINES combin\u00e9 \u00e0 un formalisme de lecture par d\u00e9limiteur permet d&rsquo;injecter directement nos vecteurs d&rsquo;exp\u00e9rimentation au sein du flux s\u00e9quentiel de compilation.<\/p>\n<h3>5.2 Structure s\u00e9miotique des phrases s\u00e9lectionn\u00e9es<\/h3>\n<p>Les observations textuelles inject\u00e9es dans notre protocole exp\u00e9rimental ont \u00e9t\u00e9 m\u00e9ticuleusement con\u00e7ues pour couvrir l&rsquo;exhaustivit\u00e9 des cas de figure qu&rsquo;un data scientist est susceptible d&rsquo;affronter dans des bases de donn\u00e9es r\u00e9elles non \u00e9pur\u00e9es. Quatre vecteurs de caract\u00e8res distincts composent cet \u00e9chantillon d&rsquo;\u00e9valuation :<\/p>\n<ul>\n<li><strong>Observation 1 :<\/strong> \u00ab\u00a0The fox ran fast\u00a0\u00bb \u2014 Ce premier enregistrement repr\u00e9sente la configuration nominale id\u00e9ale. La sous-cha\u00eene cible &lsquo;fox&rsquo; est inscrite en caract\u00e8res minuscules conventionnels et s&rsquo;ins\u00e8re au c\u0153ur de la proposition lexicale, entour\u00e9e d&rsquo;espaces r\u00e9guliers de s\u00e9paration.<\/li>\n<li><strong>Observation 2 :<\/strong> \u00ab\u00a0That is a quick FOX\u00a0\u00bb \u2014 Cette seconde cha\u00eene contient le motif cible transpos\u00e9 dans un registre typographique enti\u00e8rement en majuscules (&lsquo;FOX&rsquo;). Elle a \u00e9t\u00e9 formul\u00e9e pour mettre en lumi\u00e8re la rupture d&rsquo;\u00e9valuation caus\u00e9e par la sensibilit\u00e9 binaire de l&rsquo;encodage ASCII natif.<\/li>\n<li><strong>Observation 3 :<\/strong> \u00ab\u00a0This fox is a slow fox\u00a0\u00bb \u2014 Ce troisi\u00e8me vecteur textuel se caract\u00e9rise par la pr\u00e9sence d\u00e9lib\u00e9r\u00e9e d&rsquo;une double occurrence de la s\u00e9quence &lsquo;fox&rsquo;, r\u00e9dig\u00e9e \u00e0 chaque fois en minuscules. Ce cas d&rsquo;usage servira de pivot exp\u00e9rimental pour d\u00e9montrer l&rsquo;importance du point d&rsquo;ancrage spatial et la n\u00e9cessit\u00e9 de balayages it\u00e9ratifs.<\/li>\n<li><strong>Observation 4 :<\/strong> \u00ab\u00a0The zebra is cool\u00a0\u00bb \u2014 Le quatri\u00e8me enregistrement constitue le contr\u00f4le n\u00e9gatif du protocole scientifique. Il est totalement exempt de toute variation du motif &lsquo;fox&rsquo;, permettant de valider sans \u00e9quivoque le comportement du compilateur face \u00e0 une hypoth\u00e8se nulle d&rsquo;inclusion.<\/li>\n<\/ul>\n<h3>5.3 Visualisation et validation structurelle avec PROC PRINT<\/h3>\n<p>Avant d&rsquo;engager toute transformation algorithmique via la fonction FIND, il est imp\u00e9ratif d&rsquo;ex\u00e9cuter une proc\u00e9dure de validation structurelle afin de certifier que la table source a \u00e9t\u00e9 mat\u00e9rialis\u00e9e sans artefacts de tronquage ou de d\u00e9calage d&rsquo;octets. \u00c0 cette fin, l&rsquo;invocation de la proc\u00e9dure fondamentale PROC PRINT constitue la d\u00e9marche canonique recommand\u00e9e par les standards d&rsquo;audit du <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/\">SAS Technical Support<\/a>.<\/p>\n<p>L&rsquo;ex\u00e9cution de cette proc\u00e9dure permet de s&rsquo;assurer de l&rsquo;int\u00e9grit\u00e9 de l&rsquo;\u00e9chantillon exp\u00e9rimental. Le tableau ci-dessous synth\u00e9tise la distribution des vecteurs textuels au sein de la table initiale et servira d&rsquo;\u00e9talon comparatif immuable pour les traitements s\u00e9quentiels d\u00e9crits dans les sections subs\u00e9quentes de notre \u00e9tude :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 20px 0\">\n<thead style=\"background-color: #f2f2f2\">\n<tr>\n<th style=\"text-align: center;width: 20%\">Num\u00e9ro d&rsquo;Observation<\/th>\n<th style=\"text-align: left;width: 80%\">Valeur de la variable textuelle (phrase)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: center\">1<\/td>\n<td style=\"text-align: left\">The fox ran fast<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">2<\/td>\n<td style=\"text-align: left\">That is a quick FOX<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">3<\/td>\n<td style=\"text-align: left\">This fox is a slow fox<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">4<\/td>\n<td style=\"text-align: left\">The zebra is cool<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>6. M\u00e9thode 1 : Localisation de la premi\u00e8re occurrence avec sensibilit\u00e9 stricte<\/h2>\n<h3>6.1 \u00c9criture du code SAS pour la m\u00e9thode standard<\/h3>\n<p>L&rsquo;impl\u00e9mentation algorithmique de base de la fonction FIND consiste \u00e0 requ\u00e9rir la d\u00e9tection du motif cible sans adjoindre de modificateurs typographiques ni sp\u00e9cifier de coordonn\u00e9e spatiale d&rsquo;ancrage. Dans ce cadre programmatique standard, nous proc\u00e9dons \u00e0 la cr\u00e9ation d&rsquo;une nouvelle table d\u00e9riv\u00e9e, nomm\u00e9e <em>new_data<\/em>, par instanciation d&rsquo;une \u00e9tape DATA qui proc\u00e8de \u00e0 la lecture s\u00e9quentielle de notre jeu de donn\u00e9es de r\u00e9f\u00e9rence <em>original_data<\/em> \u00e0 travers l&rsquo;instruction de streaming SET.<\/p>\n<p>Au sein de cette \u00e9tape de compilation, nous d\u00e9clarons une nouvelle variable num\u00e9rique baptis\u00e9e <em>first_fox<\/em>. La valeur scalaire de cette variable est directement g\u00e9n\u00e9r\u00e9e par l&rsquo;appel de la fonction sous sa forme minimale : FIND(phrase, &lsquo;fox&rsquo;). Une fois l&rsquo;\u00e9tape finalis\u00e9e par la directive RUN, nous soumettons la table ainsi consolid\u00e9e \u00e0 l&rsquo;inspection de la proc\u00e9dure PROC PRINT. Cette d\u00e9marche nous permet d&rsquo;isoler l&rsquo;impact pur du comparateur d&rsquo;octets natif de SAS sur les quatre structures textuelles pr\u00e9alablement configur\u00e9es.<\/p>\n<h3>6.2 Dissection analytique des r\u00e9sultats obtenus<\/h3>\n<p>L&rsquo;\u00e9valuation des r\u00e9sultats num\u00e9riques obtenus \u00e0 l&rsquo;issue de cette premi\u00e8re m\u00e9thode exp\u00e9rimentale illustre parfaitement la rigueur d\u00e9terministe et l&rsquo;intransigeance du compilateur d&rsquo;expressions SAS. L&rsquo;examen d\u00e9taill\u00e9 des valeurs inscrites dans la variable <em>first_fox<\/em> r\u00e9v\u00e8le la typologie comportementale suivante :<\/p>\n<ul>\n<li><strong>Observation 1 :<\/strong> La variable <em>first_fox<\/em> enregistre avec une exactitude absolue la valeur num\u00e9rique 5. En analysant la s\u00e9quence de la cha\u00eene \u00ab\u00a0The fox ran fast\u00a0\u00bb, nous observons que le premier caract\u00e8re &lsquo;T&rsquo; occupe l&rsquo;indice 1, &lsquo;h&rsquo; l&rsquo;indice 2, &lsquo;e&rsquo; l&rsquo;indice 3, l&rsquo;espace s\u00e9parateur l&rsquo;indice 4, et la lettre &lsquo;f&rsquo; constitutive du motif d\u00e9bute pr\u00e9cis\u00e9ment au cinqui\u00e8me octet. L&rsquo;algorithme a donc parfaitement rempli son office.<\/li>\n<li><strong>Observation 2 :<\/strong> La variable r\u00e9ceptrice renvoie la valeur enti\u00e8re 0. Bien que le mot soit s\u00e9mantiquement pr\u00e9sent sous la forme \u00ab\u00a0FOX\u00a0\u00bb, la dissemblance de casse emp\u00eache la reconnaissance binaire. Le compilateur n&rsquo;identifie aucune correspondance pour la s\u00e9quence minuscule &lsquo;fox&rsquo;.<\/li>\n<li><strong>Observation 3 :<\/strong> Le moteur SAS affecte la valeur num\u00e9rique 6 \u00e0 l&rsquo;observation \u00ab\u00a0This fox is a slow fox\u00a0\u00bb. Le mot apparaissant en indices 6 et 20, la fonction FIND s&rsquo;est arr\u00eat\u00e9e d\u00e8s la satisfaction de la premi\u00e8re correspondance rencontr\u00e9e lors de sa progression unidirectionnelle vers la droite.<\/li>\n<li><strong>Observation 4 :<\/strong> Conform\u00e9ment aux lois de la logique formelle, la cha\u00eene t\u00e9moin \u00ab\u00a0The zebra is cool\u00a0\u00bb h\u00e9rite de la valeur 0, attestant de l&rsquo;absence totale du motif.<\/li>\n<\/ul>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/findsas2.jpg\" alt=\"\" \/><\/figure>\n<h3>6.3 Implications programmatiques du r\u00e9sultat nul<\/h3>\n<p>La production universelle du r\u00e9sultat 0 pour mat\u00e9rialiser l&rsquo;insucc\u00e8s d&rsquo;une recherche textuelle engendre des r\u00e9percussions structurelles profondes sur la fa\u00e7on dont les d\u00e9veloppeurs SAS doivent concevoir leurs arbres de d\u00e9cision logique. Dans la s\u00e9mantique formelle de SAS, toute valeur num\u00e9rique non nulle et non manquante est syst\u00e9matiquement \u00e9valu\u00e9e comme une valeur de v\u00e9rit\u00e9 bool\u00e9enne vraie (<em>TRUE<\/em>), tandis que la valeur num\u00e9rique exacte 0 est interpr\u00e9t\u00e9e comme \u00e9quivalente \u00e0 l&rsquo;\u00e9tat de fausset\u00e9 bool\u00e9enne (<em>FALSE<\/em>).<\/p>\n<p>Cette propri\u00e9t\u00e9 algorithmique remarquable autorise des constructions d&rsquo;une grande \u00e9l\u00e9gance math\u00e9matique. L&rsquo;\u00e9criture d&rsquo;une condition telle que \u00ab\u00a0IF FIND(phrase, &lsquo;fox&rsquo;) THEN DO;\u00a0\u00bb est syntaxiquement valide et hautement efficiente : elle \u00e9vite l&rsquo;explicitation redondante d&rsquo;un op\u00e9rateur relationnel de comparaison comme \u00ab\u00a0&gt; 0\u00a0\u00bb. Toutefois, une mise en garde s&rsquo;impose : le d\u00e9veloppeur doit toujours garder \u00e0 l&rsquo;esprit qu&rsquo;un r\u00e9sultat nul est un nombre entier rigoureusement diff\u00e9rent de la valeur manquante num\u00e9rique SAS (repr\u00e9sent\u00e9e par un point d\u00e9cimal). Vouloir tester l&rsquo;absence d&rsquo;un motif via une clause de filtrage v\u00e9rifiant si la valeur est manquante conduirait immanquablement \u00e0 des d\u00e9faillances logiques critiques au sein des processus d\u00e9cisionnels en production.<\/p>\n<h2>7. M\u00e9thode 2 : D\u00e9tection insensible \u00e0 la casse gr\u00e2ce au modificateur &lsquo;i&rsquo;<\/h2>\n<h3>7.1 \u00c9criture du code SAS pour la m\u00e9thode insensible<\/h3>\n<p>Afin de neutraliser les effets d\u00e9l\u00e9t\u00e8res de l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 typographique constat\u00e9e lors de l&rsquo;application de la m\u00e9thode standard, nous enrichissons \u00e0 pr\u00e9sent notre impl\u00e9mentation programmatique en exploitant l&rsquo;argument optionnel de modification. Dans le cadre de cette seconde \u00e9tape exp\u00e9rimentale, nous d\u00e9rivons notre jeu de donn\u00e9es initial vers une table augment\u00e9e en modifiant l&rsquo;assignation de notre variable d&rsquo;offset. La nouvelle variable calcul\u00e9e, que nous d\u00e9signerons conventionnellement sous le libell\u00e9 <em>first_fox_case_insensitive<\/em>, fait appel \u00e0 l&rsquo;instruction param\u00e9tr\u00e9e FIND(phrase, &lsquo;fox&rsquo;, &lsquo;i&rsquo;).<\/p>\n<p>L&rsquo;introduction de ce troisi\u00e8me param\u00e8tre litt\u00e9ral impose au compilateur de restructurer sa routine interne de comparaison de motifs. Il convient de noter que l&rsquo;argument &lsquo;i&rsquo; doit \u00eatre formellement encapsul\u00e9 entre des guillemets d&rsquo;initialisation de constante alphanum\u00e9rique. L&rsquo;ordre syntaxique strict des param\u00e8tres \u00e9tant ici pr\u00e9serv\u00e9, le compilateur comprend que la troisi\u00e8me position est d\u00e9di\u00e9e aux modificateurs algorithmiques et non \u00e0 une position de d\u00e9part. La table r\u00e9sultante est ensuite transmise pour compilation \u00e0 l&rsquo;interpr\u00e9teur de commandes et \u00e9dit\u00e9e pour observation analytique comparative.<\/p>\n<h3>7.2 Interpr\u00e9tation comparative des nouveaux r\u00e9sultats<\/h3>\n<p>La confrontation directe des m\u00e9triques issues de la m\u00e9thode standard avec celles g\u00e9n\u00e9r\u00e9es par l&rsquo;adjonction du modificateur &lsquo;i&rsquo; d\u00e9montre empiriquement l&rsquo;\u00e9l\u00e9vation substantielle du taux de rappel de la d\u00e9tection textuelle. L&rsquo;observation des sorties num\u00e9riques consolid\u00e9es permet de dresser le bilan analytique suivant :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 20px 0\">\n<thead style=\"background-color: #f2f2f2\">\n<tr>\n<th style=\"text-align: center;width: 15%\">Observation<\/th>\n<th style=\"text-align: left;width: 45%\">Texte Source (phrase)<\/th>\n<th style=\"text-align: center;width: 20%\">FIND Standard<\/th>\n<th style=\"text-align: center;width: 20%\">FIND avec &lsquo;i&rsquo;<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: center\">1<\/td>\n<td style=\"text-align: left\">The fox ran fast<\/td>\n<td style=\"text-align: center\">5<\/td>\n<td style=\"text-align: center\">5<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">2<\/td>\n<td style=\"text-align: left\">That is a quick FOX<\/td>\n<td style=\"text-align: center\">0<\/td>\n<td style=\"text-align: center\"><strong>17<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">3<\/td>\n<td style=\"text-align: left\">This fox is a slow fox<\/td>\n<td style=\"text-align: center\">6<\/td>\n<td style=\"text-align: center\">6<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">4<\/td>\n<td style=\"text-align: left\">The zebra is cool<\/td>\n<td style=\"text-align: center\">0<\/td>\n<td style=\"text-align: center\">0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>L&rsquo;observation num\u00e9ro 2 constitue le foyer paradigmatique de cette d\u00e9monstration. Alors que la m\u00e9thode standard \u00e9chouait purement et simplement en renvoyant 0, l&rsquo;activation du modificateur &lsquo;i&rsquo; permet d&rsquo;identifier sans ambigu\u00eft\u00e9 le d\u00e9but du mot \u00ab\u00a0FOX\u00a0\u00bb \u00e0 la dix-septi\u00e8me position de la cha\u00eene. Les observations 1 et 3 conservent leurs m\u00e9triques ordinales natives respectives (positions 5 et 6), ce qui atteste que l&rsquo;insensibilit\u00e9 \u00e0 la casse n&rsquo;alt\u00e8re en rien la d\u00e9tection des cha\u00eenes d\u00e9j\u00e0 conformes. Enfin, l&rsquo;observation 4 demeure inchang\u00e9e \u00e0 0, prouvant l&rsquo;absence de faux positifs induits par la flexibilit\u00e9 typographique nouvelle.<\/p>\n<h3>7.3 Consid\u00e9rations ergonomiques en science des donn\u00e9es<\/h3>\n<p>L&rsquo;exploitation judicieuse du modificateur &lsquo;i&rsquo; transcende la simple commodit\u00e9 syntaxique ; elle incarne un principe d&rsquo;optimisation structurelle hautement valoris\u00e9 dans le g\u00e9nie logiciel appliqu\u00e9 aux donn\u00e9es massives. Historiquement, pour accomplir une d\u00e9tection textuelle ind\u00e9pendante de la casse, les d\u00e9veloppeurs SAS devaient recourir \u00e0 une double transformation imbriqu\u00e9e, couramment mat\u00e9rialis\u00e9e par l&rsquo;instruction : INDEX(UPCASE(phrase), &lsquo;FOX&rsquo;). Cette formulation ancestrale, bien que fonctionnelle, pr\u00e9sentait des faiblesses architecturales manifestes.<\/p>\n<p>Sur le plan informatique, l&rsquo;imbrication d&rsquo;une fonction de conversion d&rsquo;envergure telle qu&rsquo;UPCASE contraint le syst\u00e8me d&rsquo;exploitation \u00e0 allouer un tampon m\u00e9moire temporaire pour dupliquer l&rsquo;int\u00e9gralit\u00e9 du texte en lettres majuscules avant de pouvoir entamer la phase d&rsquo;inspection. Lorsque cette op\u00e9ration est r\u00e9p\u00e9t\u00e9e sur plusieurs dizaines de millions de lignes au sein d&rsquo;une grappe de calcul ou d&rsquo;une infrastructure Hadoop\/Spark connect\u00e9e \u00e0 SAS, la surcharge de pagination m\u00e9moire et de temps processeur devient substantielle. Le modificateur &lsquo;i&rsquo; de la fonction FIND op\u00e8re la v\u00e9rification octet par octet dans les registres d&rsquo;\u00e9valuation sans jamais allouer d&rsquo;espace pour dupliquer la cha\u00eene parente, offrant ainsi un gain significatif d&rsquo;efficience computationnelle tout en \u00e9purant radicalement la structure textuelle du programmeur.<\/p>\n<h2>8. Traitement des anomalies : valeurs manquantes, espaces et longueurs de cha\u00eenes<\/h2>\n<h3>8.1 Comportement de FIND face aux donn\u00e9es manquantes<\/h3>\n<p>La r\u00e9silience d&rsquo;un syst\u00e8me d\u00e9cisionnel s&rsquo;\u00e9value principalement \u00e0 sa capacit\u00e9 \u00e0 g\u00e9rer harmonieusement les valeurs d&rsquo;entr\u00e9e d\u00e9g\u00e9n\u00e9r\u00e9es ou manquantes sans interruption brutale des cha\u00eenes de traitement de production. Dans le paradigme SAS, les donn\u00e9es textuelles manquantes sont repr\u00e9sent\u00e9es par un espace vide ou une succession d&rsquo;espaces blancs occupant toute la longueur allou\u00e9e \u00e0 la variable (longueur d&rsquo;enregistrement fixe). Lorsque la cha\u00eene h\u00f4te pass\u00e9e au premier argument de la fonction FIND est manquante, le moteur d&rsquo;ex\u00e9cution r\u00e9agit de fa\u00e7on d\u00e9terministe en retournant invariablement la valeur 0, sans consigner le moindre message d&rsquo;erreur d&rsquo;ex\u00e9cution dans le journal de bord.<\/p>\n<p>La situation s&rsquo;av\u00e8re toutefois beaucoup plus p\u00e9rilleuse lorsque c&rsquo;est la <em>sous-cha\u00eene cible<\/em> (le deuxi\u00e8me param\u00e8tre) qui se r\u00e9v\u00e8le manquante ou enti\u00e8rement constitu\u00e9e d&rsquo;espaces non \u00e9lagu\u00e9s. Dans cette conjoncture sp\u00e9cifique, l&rsquo;algorithme tente de localiser un espace blanc au sein de la cha\u00eene h\u00f4te. Si celle-ci renferme le moindre espace s\u00e9parateur, la fonction FIND identifiera cet espace comme la correspondance recherch\u00e9e et renverra sa position ordinale, g\u00e9n\u00e9rant des comportements algorithmiques inattendus et difficilement d\u00e9celables lors des revues de code. Il est par cons\u00e9quent fortement recommand\u00e9 d&rsquo;assainir syst\u00e9matiquement la sous-cha\u00eene de recherche \u00e0 l&rsquo;aide de tests pr\u00e9alables assurant la non-vacuit\u00e9 du motif avant de solliciter le comparateur d&rsquo;octets.<\/p>\n<h3>8.2 Probl\u00e9matique des espaces de fin (Trailing Blanks) dans SAS<\/h3>\n<p>La gestion sous-jacente des cha\u00eenes de caract\u00e8res par le moteur de base de SAS repose historiquement sur l&rsquo;attribution de blocs de m\u00e9moire \u00e0 longueur statique fixe. Lorsqu&rsquo;une variable est dimensionn\u00e9e avec un attribut tel que LENGTH variable_texte $ 50;, tout enregistrement dont la taille r\u00e9elle est inf\u00e9rieure \u00e0 50 octets voit ses octets restants automatiquement assign\u00e9s \u00e0 la valeur hexad\u00e9cimale &rsquo;20&rsquo;x, correspondant au caract\u00e8re espace dans la table ASCII. Ces espaces de bourrage terminal (<em>trailing blanks<\/em>) exercent une influence redoutable sur les op\u00e9rations de localisation textuelle si le d\u00e9veloppeur omet d&rsquo;en appr\u00e9hender le r\u00f4le.<\/p>\n<p>Si un analyste utilise une variable auxiliaire pour h\u00e9berger la cible de sa recherche et que cette variable est dimensionn\u00e9e plus largement que le terme qu&rsquo;elle contient, la fonction FIND recherchera le terme <em>ainsi que<\/em> tous les espaces de fin non tronqu\u00e9s. Par exemple, si la cible contient le mot &lsquo;cat&rsquo; suivi de quarante-sept espaces, le motif &lsquo;cat &lsquo; ne sera jamais localis\u00e9 dans une phrase continue comme &lsquo;The cat is on the table&rsquo;. Pour neutraliser ce comportement pervers sans devoir modifier la d\u00e9finition globale du dictionnaire de donn\u00e9es, l&rsquo;incorporation conjointe du modificateur &lsquo;t&rsquo; ou le recours \u00e0 la fonction de compression pr\u00e9liminaire STRIP s&rsquo;av\u00e8re absolument indispensable pour garantir la validit\u00e9 des intersections de cha\u00eenes.<\/p>\n<h3>8.3 D\u00e9passements de limites et caract\u00e8res non imprimables<\/h3>\n<p>Les environnements de production modernes sont fr\u00e9quemment confront\u00e9s \u00e0 des flux de donn\u00e9es pollu\u00e9s par des caract\u00e8res non imprimables, des ruptures de saut de ligne ou des symboles d&rsquo;\u00e9chappement issus de processus d&rsquo;extraction web ou de transactions de bases relationnelles tierces. La fonction FIND est intrins\u00e8quement \u00e9quip\u00e9e pour analyser ces s\u00e9quences occultes. Il est ainsi parfaitement envisageable d&rsquo;identifier la coordonn\u00e9e spatiale d&rsquo;une tabulation horizontale (repr\u00e9sent\u00e9e par la constante hexad\u00e9cimale &rsquo;09&rsquo;x) ou d&rsquo;un retour chariot (constant &lsquo;0A&rsquo;x ou &lsquo;0D&rsquo;x) en passant directement la s\u00e9quence hexad\u00e9cimale appropri\u00e9e en second argument de la fonction FIND.<\/p>\n<p>Par ailleurs, l&rsquo;introduction de valeurs dynamiques pour l&rsquo;argument <em>startpos<\/em> g\u00e9n\u00e8re des risques de d\u00e9passement de fronti\u00e8res lorsque ces indices r\u00e9sultent d&rsquo;un calcul it\u00e9ratif complexe. Si un algorithme calcule une position de d\u00e9part sup\u00e9rieure \u00e0 la taille mat\u00e9rielle de la cha\u00eene h\u00f4te, la fonction FIND amortit l&rsquo;anomalie en renvoyant purement et simplement la valeur 0. De m\u00eame, la gestion des encodages multioctets, tels que l&rsquo;UTF-8 de plus en plus pr\u00e9valent dans SAS Viya par rapport au standard historique WLATIN1 sous Windows, exige une attention accrue : sous UTF-8, certains glyphes accentu\u00e9s requi\u00e8rent deux \u00e0 quatre octets de stockage, ce qui peut occasionner des d\u00e9calages d&rsquo;indices si l&rsquo;on tente d&rsquo;interfacer des fonctions bas\u00e9es sur les octets avec des fonctions calibr\u00e9es sur les caract\u00e8res logiques.<\/p>\n<h2>9. \u00c9tude comparative : FIND vis-\u00e0-vis des fonctions alternatives de SAS<\/h2>\n<h3>9.1 FIND contre INDEX : filiation et modernit\u00e9 syntaxique<\/h3>\n<p>Pour quiconque explore des programmes SAS patrimoniaux con\u00e7us au cours des d\u00e9cennies pr\u00e9c\u00e9dentes, la pr\u00e9sence r\u00e9currente de la fonction <strong>INDEX<\/strong> constitue un constat quasi-syst\u00e9matique. Historiquement, la fonction INDEX constituait la m\u00e9thode officielle pr\u00e9conis\u00e9e par l&rsquo;\u00e9diteur pour d\u00e9terminer l&#8217;emplacement d&rsquo;une s\u00e9quence de caract\u00e8res. Sa syntaxe rudimentaire se r\u00e9sume \u00e0 l&rsquo;expression \u00e9l\u00e9mentaire INDEX(string, substring). Bien que fonctionnellement viable pour des analyses triviales, INDEX souffre de limitations architecturales insurmontables qui ont motiv\u00e9 la cr\u00e9ation de FIND lors du lancement de la version 9 du syst\u00e8me SAS.<\/p>\n<p>La distinction majeure r\u00e9side dans l&rsquo;incapacit\u00e9 absolue d&rsquo;INDEX \u00e0 accepter des modificateurs d&rsquo;ex\u00e9cution ou \u00e0 sp\u00e9cifier un indice de d\u00e9part arbitraire. Avec INDEX, il est impossible de mener une recherche insensible \u00e0 la casse sans alt\u00e9rer la m\u00e9moire tampon par UPCASE, et il est totalement exclu d&rsquo;engager un balayage r\u00e9trograde ou d&rsquo;ignorer les <em>n<\/em> premiers caract\u00e8res d&rsquo;une cha\u00eene sans proc\u00e9der au d\u00e9coupage pr\u00e9alable du texte au moyen de la fonction SUBSTR. La fonction FIND rend donc formellement la fonction INDEX obsol\u00e8te d&rsquo;un point de vue de l&rsquo;ing\u00e9nierie logicielle contemporaine, apportant une flexibilit\u00e9 et une compacit\u00e9 syntaxique nettement sup\u00e9rieures.<\/p>\n<h3>9.2 FIND contre INDEXW : recherche de sous-cha\u00eene vs mot complet<\/h3>\n<p>Une confusion particuli\u00e8rement insidieuse dans la programmation DATA Step concerne l&rsquo;arbitrage m\u00e9thodologique entre la fonction FIND et la fonction sp\u00e9cialis\u00e9e <strong>INDEXW<\/strong>. La diff\u00e9rence fondamentale entre ces deux outils repose sur la granularit\u00e9 linguistique de l&rsquo;\u00e9l\u00e9ment recherch\u00e9. La fonction FIND est un analyseur de sous-cha\u00eenes au sens strict du terme : elle examine le flux d&rsquo;octets de fa\u00e7on continue et signale la pr\u00e9sence du motif d\u00e8s lors que la s\u00e9quence de symboles concorde, sans se soucier du contexte morphologique environnant.<\/p>\n<p>\u00c0 titre d&rsquo;illustration, si l&rsquo;on recherche le vocable &lsquo;fox&rsquo; au moyen de la fonction FIND au sein d&rsquo;une variable contenant le nom botanique &lsquo;foxglove&rsquo; (la digitale pourpre), la fonction FIND identifiera une correspondance positive et renverra l&rsquo;indice 1, bien que le concept s\u00e9mantique de l&rsquo;animal renard soit totalement absent. En contrepartie, la fonction INDEXW restreint son balayage aux <em>mots complets<\/em> (<em>words<\/em>), c&rsquo;est-\u00e0-dire aux s\u00e9quences de caract\u00e8res rigoureusement d\u00e9limit\u00e9es par des s\u00e9parateurs canoniques (tels que des espaces, des virgules ou des points). INDEXW ignorera ainsi le terme composite &lsquo;foxglove&rsquo; mais d\u00e9tectera le mot isol\u00e9 &lsquo;fox&rsquo;. D\u00e8s lors, pour toute fouille textuelle asservie \u00e0 une logique lexicale stricte, INDEXW constitue le choix rationnel, tandis que FIND s&rsquo;impose pour toute analyse structurelle d&rsquo;offsets de sous-s\u00e9quences.<\/p>\n<h3>9.3 FIND contre FINDC et VERIFY : sous-cha\u00eene vs liste de caract\u00e8res<\/h3>\n<p>L&rsquo;arsenal d&rsquo;inspection textuelle de SAS est compl\u00e9t\u00e9 par deux autres fonctions hautement sp\u00e9cialis\u00e9es dont le champ d&rsquo;action ne doit pas \u00eatre confondu avec celui de FIND : les fonctions <strong>FINDC<\/strong> et <strong>VERIFY<\/strong>. La fonction FINDC (o\u00f9 le suffixe &lsquo;C&rsquo; d\u00e9signe explicitement le mot <em>Character<\/em>) ne recherche pas une s\u00e9quence lin\u00e9aire ordonn\u00e9e de caract\u00e8res, mais inspecte la cha\u00eene h\u00f4te afin de localiser la premi\u00e8re occurrence de <em>n&rsquo;importe quel<\/em> caract\u00e8re individuel stipul\u00e9 dans une liste d&rsquo;arguments cibles. Par exemple, FINDC(texte, &lsquo;aeiou&rsquo;) identifiera la premi\u00e8re voyelle pr\u00e9sente dans le texte, quelle qu&rsquo;elle soit, op\u00e9ration que la fonction FIND est structurellement incapable d&rsquo;ex\u00e9cuter en une seule instruction.<\/p>\n<p>Quant \u00e0 la fonction VERIFY, elle adopte une posture diam\u00e9tralement oppos\u00e9e en agissant comme un op\u00e9rateur de validation de conformit\u00e9 d&rsquo;alphabet. VERIFY retourne la coordonn\u00e9e du tout premier caract\u00e8re pr\u00e9sent au sein de la cha\u00eene h\u00f4te qui <em>n&rsquo;appara\u00eet pas<\/em> dans la liste des caract\u00e8res autoris\u00e9s pass\u00e9s en param\u00e8tre. Cette fonction est typiquement mobilis\u00e9e pour certifier qu&rsquo;une variable ne contient que des chiffres d\u00e9cimaux ou que des lettres valides. Le tableau comparatif suivant sch\u00e9matise l&rsquo;arbre d\u00e9cisionnel d&rsquo;orientation technique r\u00e9gissant le choix de ces diff\u00e9rentes fonctions :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 20px 0\">\n<thead style=\"background-color: #f2f2f2\">\n<tr>\n<th style=\"text-align: left;width: 20%\">Fonction SAS<\/th>\n<th style=\"text-align: left;width: 30%\">Granularit\u00e9 de recherche<\/th>\n<th style=\"text-align: center;width: 25%\">Support des Modificateurs<\/th>\n<th style=\"text-align: left;width: 25%\">Cas d&rsquo;usage prioritaire<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\"><strong>FIND<\/strong><\/td>\n<td style=\"text-align: left\">Sous-cha\u00eene s\u00e9quentielle continue<\/td>\n<td style=\"text-align: center\">Oui (&lsquo;i&rsquo;, &lsquo;t&rsquo;)<\/td>\n<td style=\"text-align: left\">Localisation d&rsquo;offset d&rsquo;une s\u00e9quence exacte<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\"><strong>INDEX<\/strong><\/td>\n<td style=\"text-align: left\">Sous-cha\u00eene s\u00e9quentielle continue<\/td>\n<td style=\"text-align: center\">Non<\/td>\n<td style=\"text-align: left\">Code patrimonial (legacy) sans options<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\"><strong>INDEXW<\/strong><\/td>\n<td style=\"text-align: left\">Mot complet d\u00e9limit\u00e9<\/td>\n<td style=\"text-align: center\">Non<\/td>\n<td style=\"text-align: left\">Analyse lexicale et text mining \u00e9l\u00e9mentaire<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\"><strong>FINDC<\/strong><\/td>\n<td style=\"text-align: left\">Caract\u00e8re unitaire parmi une liste<\/td>\n<td style=\"text-align: center\">Oui (&lsquo;i&rsquo;, &lsquo;t&rsquo;, &lsquo;k&rsquo;, etc.)<\/td>\n<td style=\"text-align: left\">D\u00e9tection de ponctuation ou voyelles isol\u00e9es<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\"><strong>VERIFY<\/strong><\/td>\n<td style=\"text-align: left\">Caract\u00e8re non conforme \u00e0 une r\u00e9f\u00e9rence<\/td>\n<td style=\"text-align: center\">Non<\/td>\n<td style=\"text-align: left\">Contr\u00f4le qualit\u00e9 et validation d&rsquo;alphabet<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>10. Int\u00e9gration avanc\u00e9e de la fonction FIND dans la programmation DATA Step<\/h2>\n<h3>10.1 Filtrage conditionnel et sous-\u00e9chantillonnage de tables<\/h3>\n<p>L&rsquo;une des exploitations les plus r\u00e9pandues et efficientes de la fonction FIND s&rsquo;articule autour de l&rsquo;\u00e9laboration de clauses de s\u00e9lection conditionnelle dans les flux de traitement de donn\u00e9es volumineuses. Dans la grammaire de l&rsquo;\u00e9tape DATA, la fonction FIND peut \u00eatre instanci\u00e9e directement au sein d&rsquo;une instruction IF de sous-\u00e9chantillonnage ou d&rsquo;une clause de restriction spatiale WHERE. Cette approche permet de filtrer s\u00e9lectivement des cohortes de patients ou des segments de transactions sans alourdir le dictionnaire de donn\u00e9es par la cr\u00e9ation de colonnes num\u00e9riques interm\u00e9diaires superflues.<\/p>\n<p>Consid\u00e9rons, par exemple, le traitement d&rsquo;une table d&rsquo;\u00e9v\u00e9nements ind\u00e9sirables cliniques comprenant des millions d&rsquo;enregistrements non standardis\u00e9s. L&rsquo;int\u00e9gration de la clause suivante : IF FIND(description_medicale, &lsquo;infarctus&rsquo;, &lsquo;i&rsquo;) &gt; 0 THEN OUTPUT cohorte_cardiologie; permet de capturer avec une efficience maximale toutes les observations pertinentes, ind\u00e9pendamment du fait que le terme apparaisse au d\u00e9but, au milieu ou \u00e0 la fin du diagnostic, et quelle que soit la casse typographique adopt\u00e9e par le m\u00e9decin investigateur. Cette strat\u00e9gie de filtrage h\u00e2tif r\u00e9duit consid\u00e9rablement l&#8217;empreinte m\u00e9moire en \u00e9liminant les enregistrements non \u00e9ligibles d\u00e8s les phases amont du pipeline de donn\u00e9es.<\/p>\n<h3>10.2 Combinaison matricielle avec la fonction SUBSTR pour l&rsquo;extraction dynamique<\/h3>\n<p>L&rsquo;utilisation combin\u00e9e des fonctions FIND et <strong>SUBSTR<\/strong> constitue le patron de conception (<em>design pattern<\/em>) par excellence pour l&rsquo;analyse syntaxique (<em>parsing<\/em>) et l&rsquo;extraction dynamique d&rsquo;\u00e9l\u00e9ments d&rsquo;information structur\u00e9s au sein de cha\u00eenes h\u00e9t\u00e9rog\u00e8nes. La fonction SUBSTR requiert la fourniture d&rsquo;une coordonn\u00e9e num\u00e9rique de d\u00e9part et d&rsquo;une longueur d&rsquo;extraction. Dans les situations du monde r\u00e9el, la coordonn\u00e9e de d\u00e9but d&rsquo;un param\u00e8tre variable ne peut \u00eatre postul\u00e9e de fa\u00e7on statique ; elle doit \u00eatre d\u00e9couverte dynamiquement \u00e0 l&rsquo;ex\u00e9cution par la fonction FIND.<\/p>\n<p>Imaginons un journal applicatif o\u00f9 chaque ligne comporte une \u00e9tiquette d&rsquo;identification suivie d&rsquo;une adresse de protocole r\u00e9seau, sous la forme standardis\u00e9e \u00ab\u00a0Client_IP=192.168.1.50; Status=OK\u00a0\u00bb. Pour extraire l&rsquo;adresse de fa\u00e7on totalement dynamique sans recourir \u00e0 des expressions r\u00e9guli\u00e8res lourdes, l&rsquo;analyste proc\u00e8de en deux \u00e9tapes coordonn\u00e9es : il utilise d&rsquo;abord la fonction FIND pour d\u00e9terminer l&rsquo;indice de l&rsquo;\u00e9tiquette \u00ab\u00a0Client_IP=\u00a0\u00bb, ajoute la longueur intrins\u00e8que de cette \u00e9tiquette pour localiser le premier chiffre de l&rsquo;adresse, puis exploite un second appel \u00e0 FIND ciblant le point-virgule terminal pour en d\u00e9duire la longueur exacte de l&rsquo;\u00e9l\u00e9ment \u00e0 d\u00e9couper via SUBSTR. Ce cha\u00eenage algorithmique offre une vitesse de calcul in\u00e9gal\u00e9e par les moteurs d&rsquo;expressions r\u00e9guli\u00e8res conventionnels.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/findsas3.jpg\" alt=\"\" \/><\/figure>\n<h3>10.3 Boucles programm\u00e9es pour identifier toutes les occurrences multiples<\/h3>\n<p>Par d\u00e9finition, un appel unitaire \u00e0 la fonction FIND n&rsquo;identifie jamais qu&rsquo;une seule occurrence d&rsquo;un motif \u00e0 la fois. Lorsque l&rsquo;objectif analytique consiste \u00e0 comptabiliser l&rsquo;exhaustivit\u00e9 des r\u00e9p\u00e9titions d&rsquo;une sous-cha\u00eene ou \u00e0 cartographier spatialement chacune de ses apparitions au sein d&rsquo;un texte litt\u00e9raire ou g\u00e9nomique \u00e9tendu, il devient imp\u00e9ratif d&rsquo;int\u00e9grer la fonction FIND au sein d&rsquo;une boucle it\u00e9rative conditionnelle contr\u00f4l\u00e9e, de type DO WHILE.<\/p>\n<p>L&rsquo;architecture algorithmique d&rsquo;une telle routine s&rsquo;articule autour de la r\u00e9affectation dynamique du param\u00e8tre <em>startpos<\/em> \u00e0 chaque it\u00e9ration du cycle de calcul. L&rsquo;algorithme initialise sa position de d\u00e9part \u00e0 l&rsquo;indice 1. D\u00e8s qu&rsquo;une occurrence est localis\u00e9e \u00e0 un indice <em>p<\/em> strictement sup\u00e9rieur \u00e0 0, cette coordonn\u00e9e est consign\u00e9e au sein d&rsquo;un vecteur de stockage (g\u00e9n\u00e9ralement mat\u00e9rialis\u00e9 par un ARRAY SAS). Imm\u00e9diatement apr\u00e8s, l&rsquo;indice de d\u00e9part de l&rsquo;it\u00e9ration suivante est reconfigur\u00e9 \u00e0 la position <em>p + 1<\/em>, ou <em>p + LENGTH(motif)<\/em> si l&rsquo;on souhaite interdire le chevauchement spatial des motifs d\u00e9tect\u00e9s. La boucle it\u00e8re ainsi de fa\u00e7on d\u00e9terministe jusqu&rsquo;\u00e0 ce que la fonction FIND retourne la valeur 0, signifiant l&rsquo;\u00e9puisement complet des correspondances au sein du vecteur analys\u00e9.<\/p>\n<h2>11. Performance computationnelle et bonnes pratiques en environnement Big Data<\/h2>\n<h3>11.1 Impact sur le temps CPU et la m\u00e9moire vive<\/h3>\n<p>\u00c0 l&rsquo;\u00e8re des m\u00e9gadonn\u00e9es et des architectures analytiques d&rsquo;entreprise telles que SAS Grid ou <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/software\/viya.html\">SAS Viya<\/a>, l&rsquo;impact de chaque micro-op\u00e9ration textuelle sur l&rsquo;infrastructure mat\u00e9rielle sous-jacente doit \u00eatre rigoureusement quantifi\u00e9. La recherche d&rsquo;une sous-cha\u00eene par la fonction FIND repose sur un algorithme de balayage lin\u00e9aire dont la complexit\u00e9 asymptotique moyenne est proportionnelle au produit de la longueur de la cha\u00eene h\u00f4te par celle du motif cible. \u00c0 l&rsquo;\u00e9chelle d&rsquo;une table contenant plusieurs centaines de millions de lignes d&rsquo;historique de cartes bancaires, un appel inefficace r\u00e9p\u00e9t\u00e9 \u00e0 chaque cycle du vecteur de donn\u00e9es (PDV) peut rapidement saturer les c\u0153urs du processeur.<\/p>\n<p>L&rsquo;introduction du modificateur &lsquo;i&rsquo; impose une p\u00e9nalit\u00e9 computationnelle mesurable, quoique modeste, comparativement au mode natif sensible \u00e0 la casse. Le compilateur devant ex\u00e9cuter une op\u00e9ration arithm\u00e9tique de normalisation de registre sur chaque octet \u00e9valu\u00e9, le temps CPU total peut s&rsquo;accro\u00eetre d&rsquo;environ 15 % \u00e0 25 % lors de tests massifs sous haute charge. Par cons\u00e9quent, il demeure hautement recommand\u00e9 de normaliser pr\u00e9alablement les colonnes de mani\u00e8re permanente dans la base relationnelle source (en appliquant une \u00e9tape d&rsquo;ingestion unique) plut\u00f4t que de d\u00e9l\u00e9guer syst\u00e9matiquement cette charge de d\u00e9sensibilisation \u00e0 la vol\u00e9e \u00e0 chaque requ\u00eate analytique ex\u00e9cut\u00e9e en aval.<\/p>\n<h3>11.2 Optimisation des longueurs de variables avec LENGTH<\/h3>\n<p>Une anomalie d&rsquo;ing\u00e9nierie extr\u00eamement r\u00e9pandue dans le d\u00e9veloppement SAS consiste \u00e0 surdimensionner syst\u00e9matiquement les variables de type caract\u00e8re par pure pr\u00e9caution d\u00e9clarative, par exemple en affectant aveugl\u00e9ment un attribut de longueur maximale, tel que LENGTH message $ 32767;. Cette pratique engendre un gaspillage catastrophique des ressources de pagination m\u00e9moire et d\u00e9grade s\u00e9v\u00e8rement les performances intrins\u00e8ques de la fonction FIND.<\/p>\n<p>Lorsqu&rsquo;une variable de 32 767 octets est soumise \u00e0 l&rsquo;inspection de FIND sans utilisation conjointe des modificateurs de rognage appropri\u00e9s, le sous-syst\u00e8me de calcul examine m\u00e9thodiquement l&rsquo;int\u00e9gralit\u00e9 du tampon d&rsquo;octets allou\u00e9, y compris les dizaines de milliers d&rsquo;espaces de remplissage terminaux qui comblent le vide mat\u00e9riel. Pour garantir un traitement ultra-rapide au sein de la m\u00e9moire cache du processeur, le d\u00e9veloppeur chevronn\u00e9 doit imp\u00e9rativement dimensionner chaque variable alphanum\u00e9rique au plus juste de son contenu effectif au moyen de l&rsquo;instruction LENGTH, et exploiter rigoureusement le modificateur &lsquo;t&rsquo; ou la fonction TRIM lorsque les sous-cha\u00eenes cibles d\u00e9rivent de colonnes textuelles \u00e0 g\u00e9om\u00e9trie fixe.<\/p>\n<h3>11.3 Normalisation du code et lisibilit\u00e9 en milieu de production<\/h3>\n<p>Dans un contexte de d\u00e9veloppement industriel certifi\u00e9 (comme les environnements soumis aux r\u00e9glementations FDA 21 CFR Part 11 dans l&rsquo;industrie pharmaceutique), la compacit\u00e9 d&rsquo;un script ne doit jamais s&rsquo;obtenir au d\u00e9triment de sa clart\u00e9 et de son auditabilit\u00e9. L&rsquo;utilisation de la fonction FIND avec des modificateurs cryptiques ou des positions de d\u00e9part implicites constitue une source r\u00e9currente de non-conformit\u00e9s lors des revues de code entre pairs. Il est imp\u00e9ratif d&rsquo;\u00e9dicter des normes de programmation strictes encadrant l&rsquo;usage de cette fonction.<\/p>\n<p>Chaque appel \u00e0 la fonction FIND exploitant des modificateurs combin\u00e9s ou un balayage r\u00e9trograde n\u00e9gatif doit imp\u00e9rativement faire l&rsquo;objet d&rsquo;un bloc de commentaires descriptifs explicitant les hypoth\u00e8ses textuelles retenues. De surcro\u00eet, afin d&rsquo;assurer la p\u00e9rennit\u00e9 et la portabilit\u00e9 des programmes entre les versions SAS 9.4 traditionnelles sous encodage mono-octet et les nouvelles plateformes infonuagiques SAS Viya configur\u00e9es nativement en UTF-8 multioctet, les analystes doivent privil\u00e9gier l&rsquo;utilisation de variables typ\u00e9es explicitement et encapsuler les algorithmes d&rsquo;extraction complexes au sein de macros SAS param\u00e9tr\u00e9es et rigoureusement document\u00e9es.<\/p>\n<h2>12. Synth\u00e8se m\u00e9thodologique et guide de r\u00e9solution des anomalies courantes<\/h2>\n<h3>12.1 Tableau d\u00e9cisionnel des sc\u00e9narios d&rsquo;utilisation de FIND<\/h3>\n<p>Afin de fournir aux ing\u00e9nieurs et analystes de donn\u00e9es un cadre de r\u00e9f\u00e9rence op\u00e9rationnel imm\u00e9diat, nous avons synth\u00e9tis\u00e9 dans la matrice multidimensionnelle ci-dessous l&rsquo;ensemble des configurations param\u00e9triques optimales de la fonction FIND en regard des cas d&rsquo;usage industriels les plus fr\u00e9quemment rencontr\u00e9s sur le terrain :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 20px 0\">\n<thead style=\"background-color: #f2f2f2\">\n<tr>\n<th style=\"text-align: left;width: 25%\">Objectif Analytique<\/th>\n<th style=\"text-align: center;width: 20%\">Argument modificateurs<\/th>\n<th style=\"text-align: center;width: 20%\">Argument startpos<\/th>\n<th style=\"text-align: left;width: 35%\">Formulation syntaxique type<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">Localisation stricte de premi\u00e8re occurrence<\/td>\n<td style=\"text-align: center\">Omis (vide)<\/td>\n<td style=\"text-align: center\">Omis (d\u00e9faut 1)<\/td>\n<td style=\"text-align: left\">FIND(texte, &lsquo;motif&rsquo;)<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Recherche insensible \u00e0 la casse typographique<\/td>\n<td style=\"text-align: center\">&lsquo;i&rsquo;<\/td>\n<td style=\"text-align: center\">Omis (d\u00e9faut 1)<\/td>\n<td style=\"text-align: left\">FIND(texte, &lsquo;motif&rsquo;, &lsquo;i&rsquo;)<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Recherche avec cible issue d&rsquo;une variable<\/td>\n<td style=\"text-align: center\">&lsquo;it&rsquo; ou &lsquo;t&rsquo;<\/td>\n<td style=\"text-align: center\">Omis (d\u00e9faut 1)<\/td>\n<td style=\"text-align: left\">FIND(texte, var_cible, &lsquo;it&rsquo;)<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Recherche s\u00e9quentielle \u00e0 partir d&rsquo;un offset<\/td>\n<td style=\"text-align: center\">\u00a0\u00bb ou &lsquo;i&rsquo;<\/td>\n<td style=\"text-align: center\">Entier positif (&gt;1)<\/td>\n<td style=\"text-align: left\">FIND(texte, &lsquo;motif&rsquo;, &lsquo;i&rsquo;, 10)<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Identification de la derni\u00e8re occurrence<\/td>\n<td style=\"text-align: center\">\u00a0\u00bb ou &lsquo;i&rsquo;<\/td>\n<td style=\"text-align: center\">Entier n\u00e9gatif (&lt;0)<\/td>\n<td style=\"text-align: left\">FIND(texte, &lsquo;motif&rsquo;, \u00a0\u00bb, -LENGTH(texte))<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>12.2 Diagnostic et r\u00e9solution des erreurs fr\u00e9quentes<\/h3>\n<p>L&rsquo;exploitation de la fonction FIND au sein de flux de scripts denses expose in\u00e9vitablement les d\u00e9veloppeurs \u00e0 des erreurs d&rsquo;impl\u00e9mentation typiques. L&rsquo;anomalie la plus pernicieuse consiste en l&rsquo;interversion accidentelle des deux premiers arguments positionnels, c&rsquo;est-\u00e0-dire sp\u00e9cifier la sous-cha\u00eene cible en premi\u00e8re position et la cha\u00eene h\u00f4te en seconde position. Cette inversion syntaxique ne g\u00e9n\u00e8re aucune erreur de compilation si les deux entit\u00e9s sont de type caract\u00e8re, mais conduit invariablement au retour universel de la valeur 0 d\u00e8s lors que la sous-cha\u00eene est plus courte que la cha\u00eene h\u00f4te, plongeant l&rsquo;analyste dans une incompr\u00e9hension totale face \u00e0 des r\u00e9sultats d\u00e9sesp\u00e9r\u00e9ment vides.<\/p>\n<p>Une seconde d\u00e9faillance fr\u00e9quente r\u00e9side dans la confusion entourant l&rsquo;ordre des arguments en pr\u00e9sence du param\u00e8tre <em>startpos<\/em>. Si l&rsquo;on souhaite stipuler une position de d\u00e9part num\u00e9rique sans utiliser de modificateurs alphab\u00e9tiques, il est formellement interdit d&rsquo;omettre purement et simplement le troisi\u00e8me argument en \u00e9crivant FIND(texte, &lsquo;motif&rsquo;, 5). Dans une telle conjoncture, le compilateur SAS interpr\u00e8te le nombre 5 comme un modificateur textuel ill\u00e9gal, consignant imm\u00e9diatement une erreur syntaxique bloquante dans le journal d&rsquo;ex\u00e9cution. La syntaxe rigoureuse impose de combler le troisi\u00e8me emplacement par une cha\u00eene vide : FIND(texte, &lsquo;motif&rsquo;, \u00a0\u00bb, 5).<\/p>\n<h3>12.3 Checklist de contr\u00f4le qualit\u00e9 avant mise en production<\/h3>\n<p>Pour garantir une \u00e9tanch\u00e9it\u00e9 op\u00e9rationnelle absolue avant la mise en production de programmes exploitant intensivement la fonction FIND, chaque script DATA Step doit \u00eatre confront\u00e9 \u00e0 une grille d&rsquo;audit de qualit\u00e9 logicielle standardis\u00e9e. Cette revue m\u00e9thodologique syst\u00e9matique permet de juguler les r\u00e9gressions fonctionnelles et d&rsquo;assurer une robustesse algorithmique sans faille sur des donn\u00e9es r\u00e9elles :<\/p>\n<ul>\n<li><strong>V\u00e9rification de l&rsquo;encadrement des modificateurs :<\/strong> S&rsquo;assurer que tous les modificateurs tels que &lsquo;i&rsquo;, &lsquo;t&rsquo; ou &lsquo;it&rsquo; sont rigoureusement entour\u00e9s de guillemets simples ou doubles et occupent scrupuleusement la troisi\u00e8me position positionnelle de l&rsquo;instruction.<\/li>\n<li><strong>Validation du comportement face aux valeurs manquantes :<\/strong> V\u00e9rifier par un jeu d&rsquo;essais unitaire que le programme r\u00e9agit de fa\u00e7on d\u00e9terministe et conforme au cahier des charges lorsque la variable textuelle analys\u00e9e h\u00e9berge une valeur vide ou constitu\u00e9e exclusivement d&rsquo;espaces.<\/li>\n<li><strong>\u00c9lagage des cibles dynamiques :<\/strong> Confirmer syst\u00e9matiquement la pr\u00e9sence du modificateur &lsquo;t&rsquo; ou de la fonction TRIM\/STRIP d\u00e8s lors que le second param\u00e8tre de recherche n&rsquo;est pas une constante textuelle litt\u00e9rale brute mais provient d&rsquo;une variable SAS pr\u00e9existante.<\/li>\n<li><strong>V\u00e9rification des bornes d&rsquo;indexation :<\/strong> S&rsquo;assurer qu&rsquo;aucun calcul arithm\u00e9tique dynamique n&rsquo;est susceptible de transmettre la valeur num\u00e9rique 0 \u00e0 l&rsquo;argument <em>startpos<\/em>, ce qui g\u00e9n\u00e9rerait une interruption d&rsquo;ex\u00e9cution et l&rsquo;assignation d&rsquo;une valeur manquante.<\/li>\n<li><strong>Audit des longueurs de variables :<\/strong> Examiner les instructions LENGTH associ\u00e9es aux variables textuelles r\u00e9ceptrices ou sources afin de proscrire tout surdimensionnement arbitraire susceptible de d\u00e9grader les performances de pagination en m\u00e9moire vive.<\/li>\n<\/ul>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>SAS Institute Inc. (2016). <em>SAS(R) 9.4 Functions and CALL Routines: Reference, Fifth Edition<\/em>. Cary, NC: SAS Institute Inc. R\u00e9cup\u00e9r\u00e9 de <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/lefunctionsref\/67960\/HTML\/default\/viewer.htm#p04knd82k2m2a4n1s7i8eak3k2sp.htm\">https:\/\/support.sas.com\/documentation\/<\/a><\/p>\n<p>SAS Institute Inc. (2020). <em>SAS Viya Programming: Data Step Basics<\/em>. Cary, NC: SAS Institute Inc. R\u00e9cup\u00e9r\u00e9 de <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/v_010\/pgmsashome\/home.htm\">https:\/\/documentation.sas.com\/<\/a><\/p>\n<p>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS, Third Edition<\/em>. Cary, NC: SAS Institute Inc.<\/p>\n<p>Horstman, D. W. (2017). <em>Character String Manipulation in the SAS Data Step: Beyond the Basics<\/em>. Proceedings of the SAS Global Forum 2017 Conference. Cary, NC: SAS Institute Inc.<\/p>\n<p>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer, Sixth Edition<\/em>. Cary, NC: SAS Institute Inc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet et acad\u00e9mique sur l&rsquo;utilisation de la fonction FIND dans SAS : syntaxe, gestion de la casse, modificateurs et cas pratiques d\u00e9taill\u00e9s.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[9499,2464],"tags":[11283,11284,11285,10627,11286],"class_list":["post-9871","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-sas","category-science-des-donnees","tag-fonction-find","tag-manipulation-de-texte","tag-recherche-de-chaines","tag-sas-data-step","tag-syntaxe-sas"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9871","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=9871"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9871\/revisions"}],"predecessor-version":[{"id":9875,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9871\/revisions\/9875"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}