2010-11-11 25 views
2

Tenir compte du fragment de code sas suivant:Remplacement guillemets dans un SAS macrovariable

%macro temp(querystr=); 
    filename request temp; 

    data _null_; 
    file request; 

    put "<string>&querystr</string>"; 
    run; 
%mend temp; 

%temp(querystr="term 1" and "term2"); 

Notez que ce morceau de code ne compilera pas parce que la première citation dans queryStr fermera la citation à partir de la déclaration de vente lorsque le Le compilateur remplace querystr dans l'étape de données.

Je voudrais masquer les guillemets dans la chaîne de requête pour le transformer en un fragment XML valide, comme:

<string>&quot;term 1&quot; and &quot;term 2&quot;</string> 

est-il un moyen de sortie de la ligne ci-dessus pour le fichier avec masquage approprié du guillemets? J'ai essayé la fonction% sysfunc (TranWrd()) en combinaison avec des fonctions de masquage comme% nrbquote() etc. mais jusqu'ici je n'ai pas trouvé de solution de travail. Toute aide est appréciée!

Répondre

3

Ajouter un HTMLEncode avec l'option 'quot' au datastep et utiliser% bquote pour masquer les citations jusqu'à l'exécution macro.

%macro temp(querystr=); 

    filename request temp; 

    data _null_; 

    file request; 

    string = cats('<string>',htmlencode("&querystr",' quot'),'</string>'); 

    put string; 

    run; 

%mend temp; 

%temp(querystr=%bquote("term 1" and "term2")); 
-1

Il suffit d'utiliser put 'foo'; à la place:

%macro temp(querystr=); 
    filename request temp; 

    data _null_; 
    file request; 

    put '<string>&querystr</string>'; 
    run; 
%mend temp; 

%temp(querystr="term 1" and "term2"); 
+0

REMARQUE: Le fichier demande est: Nom du fichier = C: \ DOCUME ~ 1 \ wroehl \ LOCALS ~ 1 \ Temp \ SAS fichiers temporaires \ _TD1888 \ # LN00028, RECFM = V, LRECL = 256 REMARQUE: 1 enregistrement a été écrit dans le fichier REQUEST. La durée minimale d'enregistrement est 26. La longueur maximale d'enregistrement a été 26. NOTE: instruction DATA utilisé (Durée totale du processus): temps réel 0.03 secondes temps cpu 0.00 secondes –

+0

Cette imprime & queryStr dans le tempfile. –

1

les opérations suivantes:

options mcompilenote=all; 
%macro temp(querystr=); 
    filename request temp; 

    data _null_; 
    file request; 
    querystr=symget('querystr'); 
    querystr=htmlencode(querystr,'quot'); 
    *putlog querystr $; 
    string="<string>"!!trim(querystr)!!"</string>"; 
    put string $200.; 
    *put "<string>&querystr</string>"; 
    run; 
%mend temp; 

%temp(querystr="term 1" and "term2"); 
2

Tant que les guillemets doubles sont équilibrés, la macro est appelée correctement. Donc, vous n'avez pas besoin d'imposer aux utilisateurs de macros de citation de macro le paramètre. Votre macro peut le faire pour eux comme ci-dessous.

%macro temp(querystr=); 
    filename request temp; 
    data _null_; 
     file request; 
     s = catx(htmlencode("%superq(querystr)","quot"),"<string>","</string>"); 
     l = length(s); 
     put s $varying. l; 
    run; 
    %mend temp; 

    %temp(querystr="term 1" and "term2"); 

    /* check */ 
    data _null_; 
    infile request; 
    input; 
    put _infile_; 
    run; 
    /* on log 
    <string>&quot;term 1&quot; and &quot;term2&quot;</string> 
    */ 
+0

Merci pour l'ajout utile – Rudolf