2014-08-27 13 views
5

Sto solo cercando di concatenare due variabili macro citate ma non sembra essere un modo semplice.Variabili macro quotate concatenate

Dire che abbiamo:

%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; 

Io in realtà voglio:

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

Ma il codice precedente produce in realtà:

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

così cerco di mettere %QUOTE(), %BQUOTE, ecc. circa &VAR1 e %VAR2 nella speranza di smascherare le virgolette ma ottengo lo stesso risultato.

L'unica cosa che funziona per me è:

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

Ma questo è brutto e può ottenere lungo veramente veloce. Non c'è un modo migliore per farlo?

risposta

2

È possibile utilizzare COMPRESS per eseguire questa operazione.

%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; 

È un po 'complicato rimuovere le virgolette, ma funziona.

È inoltre possibile eseguire questa operazione in una funzione FCMP o in una macro in stile funzione; ecco un esempio

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

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

Nota non è necessario utilizzare le funzioni CAT per concatenare le variabili macro. Sono solo testo, quindi digitandoli uno dopo l'altro automaticamente li concatena.

Tuttavia, la vera risposta alla domanda "C'è un modo migliore" è di non memorizzare le virgolette nella variabile macro. La maggior parte delle volte dovresti memorizzare la variabile macro senza le virgolette e usarla tra virgolette quando necessario. Le macro SAS non rispettano le virgolette come qualcosa di speciale - sono solo un carattere in una stringa - quindi non hanno uno strumento specifico per affrontarle.

+0

Due cose ... in primo luogo - non sapevo della sintassi '& =' - grazie! In secondo luogo, potresti semplificare l'assegnazione di var3 a '% let VAR3 ="% unquote_string (string = & var1 & var2.) ";'. –

+0

È assolutamente possibile semplificarlo in questo modo. Mi piace un po 'di più, tuttavia, poiché è più chiaro di cosa si stanno rimuovendo le virgolette - una sorta di parallelo a come% UNQUOTE funziona fino alla quotatura delle macro. (Penso che dovresti chiamarlo due volte se questi erano mvars citati in una macro). – Joe

+0

In realtà, ora che ci penso, è un pessimo esempio di quando creare una funzione FCMP o una funzione macro, poiché si stanno semplicemente avviando chiamate a una funzione esistente .... si può anche chiamare direttamente la funzione . –

4

Parerò parafrasando la "vera risposta" di Joe che è: non memorizzare le virgolette nella variabile macro. Le virgolette singole e doppie nel linguaggio macro non sono diverse da qualsiasi altro carattere. Quello che dovresti fare è ritardare l'introduzione delle virgolette finché non ne hai effettivamente bisogno. Ciò si tradurrà in un codice molto più pulito, più flessibile, più facile da leggere e privo di errori.

Codice:

Avviso ho rimosso le virgolette e per concatenare le stringhe sto solo un elenco, una dopo l'altra:

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

Esempio 1

Non sono necessarie le virgolette per stampare la stringa desiderata dato che stiamo usando una dichiarazione %put in questo primo esempio - per questo motivo ho lasciato fuoriuscire le virgolette:

%PUT &TRIBUTE; 

uscita:

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

Esempio 2

Le quotazioni sono necessari perché ora siamo in terra di dati-passo:

data _null_; 
    put "&TRIBUTE"; 
run; 

uscita:

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

Si noti che entrambi questi esempi presuppongono che in realtà non si desidera stampare le virgolette sullo schermo.

+0

Normalmente eviterei le virgolette nelle variabili macro come dici tu, ma ho un paio di macro per uso generale req utilizzando parametri che possono contenere o meno virgole. Questo potrebbe causare un errore di parametro posizionale se non quotato, quindi come regola, ogni volta che scrivo questi macro, richiedo che i parametri vengano citati, per sicurezza. Ma allora potrei voler concatenare il corpo della macro o di qualcos'altro e qui è dove entra in gioco la mia domanda. – Pane

+1

Il modo corretto di gestire le virgole per evitare il problema che descrivi è quello di avvolgere i valori con la funzione macro '% bquote()'. –

+0

@Pane In effetti, non è possibile utilizzare i caratteri di citazione per questo scopo. – Joe