Extraction de mots communs à deux chaînes

Ce code est également disponible en : Deutsch English Español
Niveau de difficulté
Débutant
Publié le :
La macro `mf_wordsInStr1andStr2` prend deux paramètres, `Str1` et `Str2`, qui sont des chaînes de caractères. Elle compare les mots de `Str1` avec ceux de `Str2` et construit une nouvelle chaîne contenant uniquement les mots présents dans les deux chaînes. La comparaison est sensible à la casse. Si l'une des chaînes est vide, la macro affiche un message dans le log et ne retourne rien.
Analyse des données

Type : CREATION_INTERNE


La macro traite des chaînes de caractères fournies en paramètres. Elle ne lit ni n'écrit de données SAS traditionnelles ou externes.

1 Bloc de code
MACRO
Explication :
Définition de la macro `mf_wordsInStr1andStr2` avec ses paramètres d'entrée `Str1` et `Str2`. Déclaration des variables macro locales utilisées pour le comptage des mots, les boucles, le stockage des mots extraits et le résultat final.
Copié !
1%macro mf_wordsInStr1andStr2(
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;
2 Bloc de code
MACRO
Explication :
Ce bloc vérifie si l'une des chaînes d'entrée (`Str1` ou `Str2`) est vide. Si c'est le cas, un message est affiché dans le log SAS indiquant les valeurs des chaînes, et la macro se termine (`%return`) sans produire de sortie.
Copié !
1%IF %LENGTH(&str1)=0 or %LENGTH(&str2)=0 %THEN %DO;
2 %put base string (str1)= &str1;
3 %put compare string (str2) = &str2;
4 %return;
5%END;
3 Bloc de code
MACRO
Explication :
Utilisation de la fonction macro `%sysfunc(countw(...))` pour compter le nombre de mots dans chaque chaîne d'entrée (`Str1` et `Str2`) et stocker ces comptes dans les variables macro `count_base` et `count_extr`.
Copié !
1%let count_base=%sysfunc(countw(&Str2));
2%let count_extr=%sysfunc(countw(&Str1));
3 
4 Bloc de code
MACRO
Explication :
Boucle externe (`%do i=1 %to &count_extr;`) pour parcourir chaque mot de `Str1`. Pour chaque mot (`extr_word`), une boucle interne (`%do i2=1 %to &count_base;`) parcourt tous les mots de `Str2`. Si une correspondance est trouvée (`&extr_word=&base_word`), la variable `match` est définie à 1. Si `match` est à 1 après la boucle interne, le mot (`extr_word`) est ajouté à la variable macro `outvar` qui accumule le résultat.
Copié !
1%DO i=1 %to &count_extr;
2 %let extr_word=%scan(&Str1,&i,%str( ));
3 %let match=0;
4 %DO i2=1 %to &count_base;
5 %let base_word=%scan(&Str2,&i2,%str( ));
6 %IF &extr_word=&base_word %THEN %let match=1;
7 %END;
8 %IF &match=1 %THEN %let outvar=&outvar &extr_word;
9%END;
5 Bloc de code
MACRO
Explication :
La macro retourne la valeur de la variable macro `outvar`, qui contient tous les mots communs trouvés dans `Str1` et `Str2`, séparés par des espaces. `%mend` marque la fin de la définition de la macro.
Copié !
1 &outvar
2 
3%mend mf_wordsInStr1andStr2;
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 : Copyright (c) 2001-2006 Rodney Sparapani (from _version.sas); Copyright © 2022, SAS Institute Inc. (from print_macro_parameters.sas); Copyright 2010-2023 HMS Analytical Software GmbH (from macro_without_brief_tag.sas, _delfile.json, _issuewarningmessage.json); Allan Bowe (mentionné dans le bloc HELP START/END comme référence générale).