2014-08-27 6 views
5

Ich versuche nur, zwei quotierte Makrovariablen zu verketten, aber es scheint keinen einfachen Weg zu geben.Verkettete Makrovariablen

Sagen wir:

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 

%LET TRIBUTE=%SYSFUNC(CATX(%STR(),&VAR1,&VAR2)); 
%PUT &TRIBUTE; 

Ich möchte eigentlich:

"This is not the greatest song in the world this is just a tribute." 

Aber der obige Code liefert tatsächlich:

"This is not the greatest song in the world" "this is just a tribute." 

Also versuche ich %QUOTE() setzen, %BQUOTE usw. um &VAR1 und %VAR2 in der Hoffnung, die Zitate zu demaskieren, aber ich bekomme das gleiche Ergebnis.

Das einzige, was für mich funktioniert, ist:

%LET TRIBUTE="%SUBSTR(&VAR1.,2,%LENGTH(&VAR1.)-2) %SUBSTR(&VAR2.,2,%LENGTH(&VAR2.)-2)"; 

Aber das ist hässlich und kann sehr schnell lange erhalten. Gibt es keinen besseren Weg, dies zu tun?

Antwort

2

Sie können dazu COMPRESS verwenden.

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 


%let VAR3=%sysfunc(compress(&VAR1,%str(%"))); 
%put &=var1 &=var3; 

Es ist ein bisschen schwierig, Zitate zu entfernen, aber es funktioniert.

Sie können dies auch in einer FCMP-Funktion oder einem Funktions-Stil-Makro tun; Hier ist ein Beispiel.

%macro unquote_string(string=); 
%sysfunc(compress(&string.,%str(%'%"))) 
%mend unquote_string; 

%let VAR3="%unquote_string(string=&var1.) %unquote_string(string=&var2.)"; 
%put &=var3.; 

Hinweis: Sie sollten CAT-Funktionen nicht zum Verketten von Makrovariablen verwenden. Sie sind nur Text, also werden sie automatisch miteinander verknüpft, wenn sie nacheinander eingegeben werden.

Die eigentliche Antwort auf Ihre Frage "Gibt es einen besseren Weg" ist jedoch, die Anführungszeichen nicht in der Makrovariablen zu speichern. Die meiste Zeit sollten Sie die Makrovariable ohne Anführungszeichen speichern und sie bei Bedarf in Anführungszeichen setzen. SAS-Makros respektieren keine Anführungszeichen als etwas Besonderes - sie sind nur ein Zeichen in einer Zeichenkette - also haben sie kein spezielles Werkzeug, um damit umzugehen.

+0

Zwei Dinge ... Erstens - ich wusste nichts über die '& =' Syntax - danke! Zweitens könnten Sie Ihre var3-Zuweisung zu '% lassen VAR3 ="% unquote_string (string = & var1 & var2.) ";. –

+0

Sie könnten es absolut so vereinfachen. Ich mag die oben genannten ein bisschen mehr, obwohl es klarer ist, was Sie Zitate aus entfernen - eine Art von Parallel zu, wie "% UNQUOTE" funktioniert so weit wie Makro-Zitat. (Ich denke, Sie müssten es zweimal aufrufen, wenn es sich um Makro-Mvars handelt). – Joe

+0

Eigentlich, jetzt, wo ich darüber nachdenke, ist es ein schlechtes Beispiel dafür, wann man eine FCMP-Funktion oder Makrofunktion erstellen muss, da man Anrufe einfach in eine bestehende Funktion umschließt ... .kann die Funktion auch direkt aufrufen . –

4

Ich werde Joe's "echte Antwort" paraphrasieren, die - Zitate in der Makrovariablen nicht speichern soll. Einfache und doppelte Anführungszeichen in der Makrosprache unterscheiden sich nicht von anderen Zeichen. Was Sie tun sollten, ist die Einführung der Zitate zu verzögern, bis Sie sie tatsächlich brauchen. Dies führt zu viel sauberer, flexibler, einfacher zu lesen und fehlerfreien Code.

Code:

Hinweis Ich habe die Anführungszeichen entfernt und die Zeichenfolgen verketten führe ich sie hier nur eine nach der anderen:

%LET VAR1=This is not the greatest song in the world; 
%LET VAR2=this is just a tribute.; 
%LET TRIBUTE=&VAR1 &VAR2; 

Beispiel 1

Es sind keine Anführungszeichen erforderlich, um die gewünschte Zeichenfolge auszudrucken, da wir in diesem ersten Beispiel eine %put-Anweisung verwenden. Aus diesem Grund habe ich die Zitate weggelassen:

%PUT &TRIBUTE; 

Ausgang:

This is not the greatest song in the world this is just a tribute. 

Beispiel 2

Stimmen erforderlich sind, weil wir jetzt in Daten Schritt Land sind:

data _null_; 
    put "&TRIBUTE"; 
run; 

Ausgang:

This is not the greatest song in the world this is just a tribute. 

Beachten Sie, dass beide Beispiele davon ausgehen, dass Sie die Anführungszeichen nicht wirklich auf dem Bildschirm drucken möchten.

+0

Normalerweise würde ich Zitate in Makrovariablen vermeiden, wie Sie sagen, aber ich habe ein paar allgemeine Makros req Benutzerparameter, die Kommas enthalten können oder nicht. Dies kann einen Positionsparameterfehler verursachen, wenn er nicht zitiert wird. In der Regel, wenn ich diese Makros schreibe, benötige ich die Parameter in Anführungszeichen, um sicher zu sein. Aber dann möchte ich vielleicht im Körper des Makros verketten oder so und hier kommt meine Frage ins Spiel. – Pane

+1

Der richtige Weg, mit Kommas umzugehen, um das beschriebene Problem zu vermeiden, ist, die Werte mit der Makrofunktion '% bquote()' zu umbrechen. –

+0

@Pane In der Tat, Zitat Zeichen sollten nicht für diesen Zweck verwendet werden. – Joe