Macro d'extraction de mots uniques entre deux chaînes

Ce code est également disponible en : Deutsch English Español
Niveau de difficulté
Débutant
Publié le :
La macro `%mf_wordsInStr1ButNotStr2` est conçue pour identifier et extraire des mots uniques. Elle accepte deux paramètres principaux, `Str1` et `Str2`, tous deux des chaînes de caractères contenant des mots séparés par des espaces. Une vérification initiale est effectuée pour s'assurer que les chaînes d'entrée ne sont pas vides; si elles le sont, la macro affiche un message informatif et se termine prématurément.
Les variables locales (`count_base`, `count_extr`, `i`, `i2`, `extr_word`, `base_word`, `match`, `outvar`) sont déclarées pour éviter toute interférence avec des variables macro globales. Les fonctions macro `%sysfunc(countw(...))` sont utilisées pour déterminer le nombre de mots dans chaque chaîne, stockés dans `count_extr` pour `Str1` et `count_base` pour `Str2`.
Le cœur de la logique est une double boucle imbriquée. La boucle externe (`%do i=1 %to &count_extr;`) itère sur chaque mot de `Str1`, extrait par `%scan(&Str1,&i,%str( ))`. Pour chaque mot extrait (`extr_word`), une variable `match` est initialisée à 0. La boucle interne (`%do i2=1 %to &count_base;`) parcourt alors chaque mot de `Str2`, extrait de manière similaire (`base_word`). Si `extr_word` correspond à `base_word`, `match` est défini à 1.
Après la fin de la boucle interne, si la variable `match` est toujours à 0 (indiquant qu'aucun mot correspondant n'a été trouvé dans `Str2`), alors `extr_word` est ajouté à la variable macro `outvar`, qui accumule les mots uniques. Enfin, la macro émet le contenu de `outvar`, présentant ainsi les mots de `Str1` qui n'étaient pas présents dans `Str2`.
Analyse des données

Type : CREATION_INTERNE


La macro `%mf_wordsInStr1ButNotStr2` traite exclusivement des chaînes de caractères qui lui sont passées comme arguments (`Str1` et `Str2`). Il n'y a pas d'accès direct à des jeux de données SAS existants (y compris SASHELP) ou à des fichiers externes pour ses opérations principales. Les 'données' traitées sont donc des valeurs textuelles fournies dynamiquement lors de l'appel de la macro, ne nécessitant pas de sources de données externes ou internes préexistantes.

1 Bloc de code
MACRO
Explication :
Ce bloc définit la macro SAS `%mf_wordsInStr1ButNotStr2`. Il utilise des variables locales pour encapsuler son fonctionnement. La logique commence par une vérification des chaînes d'entrée pour s'assurer qu'elles ne sont pas vides, suivi du calcul du nombre de mots dans chaque chaîne via `%sysfunc(countw())`. Des boucles imbriquées parcourent les mots des deux chaînes à l'aide de la fonction `%scan()`. Le mot courant de `Str1` (`extr_word`) est comparé à chaque mot de `Str2` (`base_word`). Si `extr_word` n'est pas trouvé dans `Str2`, il est ajouté à la variable macro `outvar`. Enfin, la macro émet le contenu de `outvar`, fournissant la liste des mots uniques présents dans `Str1` mais absents de `Str2`. Cette implémentation est purement macro et ne génère pas de jeux de données SAS intermédiaires.
Copié !
1%macro mf_wordsInStr1ButNotStr2(
2 Str1= /* string containing words to extract */
3 ,Str2= /* used to compare with the extract string */
4)/*/STORE SOURCE*/;
5 
6%local count_base count_extr i i2 extr_word base_word match outvar;
7%IF %LENGTH(&str1)=0 or %LENGTH(&str2)=0 %THEN %DO;
8 %put base string (str1)= &str1;
9 %put compare string (str2) = &str2;
10 %return;
11%END;
12%let count_base=%sysfunc(countw(&Str2));
13%let count_extr=%sysfunc(countw(&Str1));
14 
15%DO i=1 %to &count_extr;
16 %let extr_word=%scan(&Str1,&i,%str( ));
17 %let match=0;
18 %DO i2=1 %to &count_base;
19 %let base_word=%scan(&Str2,&i2,%str( ));
20 %IF &extr_word=&base_word %THEN %let match=1;
21 %END;
22 %IF &match=0 %THEN %let outvar=&outvar &extr_word;
23%END;
24 
25 &outvar
26 
27%mend mf_wordsInStr1ButNotStr2;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Les informations de copyright sont compilées à partir de la section d'aide de la macro principale et des fichiers référencés: 'Allan Bowe' (auteur ou contributeur mentionné dans l'aide principale). Copyrights additionnels des fichiers référencés: 'Copyright (c) 2001-2006 Rodney Sparapani' (du fichier `_version.sas`, sous licence GNU General Public License), 'Copyright 2010-2023 HMS Analytical Software GmbH' (du fichier `macro_without_brief_tag.sas`), 'Copyright © 2022, SAS Institute Inc.' (du fichier `print_macro_parameters.sas`, sous licence Apache-2.0), et 'Code original de ChrisNZ' (du fichier `datastep_infile_trick.json`, sous licence Apache-2.0). Des extraits de la documentation SAS Viya sont également inclus dans les références.