Qual è il tuo miglior trucco per uscire da una condizione di preventivo sbilanciata in BASE SAS?

StackOverflow https://stackoverflow.com/questions/107414

  •  01-07-2019
  •  | 
  •  

Domanda

Come programmatore SAS di base, conosci il drill:

Invii il tuo codice SAS, che contiene un preventivo non bilanciato, quindi ora hai non solo un preventivo non chiuso, ma anche commenti non chiusi, definizioni di funzioni macro e una sequenza mancante; o smettere; comunicato.

Qual è il tuo miglior trucco per non disturbare quelle citazioni sbilanciate?

È stato utile?

Soluzione

guida aziendale 3 utilizzata per mettere la seguente riga all'inizio del suo codice generato automaticamente:

*';*";*/;run;

tuttavia, l'unico modo per veramente "resettare" da qualsiasi tipo di problema sbilanciato c'è di uscire dalla sessione di sas e bilanciare tutto ciò che è sbilanciato prima di reinviare il codice. L'uso di questo tipo di hack rapidi (economici?) Non risolve la causa principale.

a proposito, ods _all_ close; chiude tutto le destinazioni ods, inclusa la destinazione dei risultati predefinita. in una sessione interattiva, è necessario riaprirlo con risultati ods; o risultati ods attivi; almeno secondo la documentazione. ma quando l'ho provato sul mio 9.2, non ha funzionato, come mostrato di seguito:

%put sysvlong=&sysvlong sysscpl=&sysscpl;
/* sysvlong=9.02.01M0P020508 sysscpl=X64_VSPRO */

ods _all_ close;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

ods results on;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

Altri suggerimenti

Per quanto mi riguarda, di solito Google per " quotazione sbilanciata SAS " , e finiamo con l'invio di qualcosa come questo :

*); */; /*’*/ /*”*/; %mend;

... per uscire da commenti non chiusi, virgolette e funzioni macro.

Ecco quello che uso.

 ;*';*";*/;quit;run;
 ODS _ALL_ CLOSE;
 QUIT; RUN;

Ho avuto una situazione con virgolette non bilanciate in una macro e l'unica soluzione era chiudere l'istanza di SAS e ricominciare da capo.

Sento che è un difetto inaccettabile in SAS.

Tuttavia, ho usato i metodi di ENTRAMBE 2 e 5 e ha funzionato. Prima # 2 e poi # 1. Li ho inseriti sopra TUTTO il codice, inclusa la mia intestazione, spiegando cosa stava facendo questo programma.

Ha funzionato come un fascino.

Ho scritto un programma perl che legge tutti i programmi SAS e tiene traccia delle cose che dovrebbero venire in coppia. Con elementi come parentesi, che possono essere incorporati, stampa il livello di annidamento all'inizio di ogni riga. Deve essere in grado di distinguere le parentesi che fanno parte delle funzioni macro da quelle che fanno parte delle funzioni di passaggio dei dati, comprese le chiamate% sysfunc che risiedono nell'ambiente macro ma che effettuano chiamate alle funzioni di passaggio dei dati (devono fare anche simili per la macro% syscall invocazioni di funzioni), ma ciò è possibile tramite espressioni regolari. Se il livello di annidamento diventa negativo, è un indizio che il problema potrebbe essere nelle vicinanze.

Comincia anche a contare le virgolette singole e doppie dall'inizio del programma e identifica se il conteggio di ciascuno di questi simboli che incontra è pari o dispari. Come per le parentesi, deve essere in grado di distinguere le virgolette che fanno parte del codice macro da quelle che fanno parte del codice del passo dati e anche quelle che fanno parte di stringhe letterali come O'Riley e% nrstr (% '% " ) e non contarli, ma anche la corrispondenza dei modelli può gestirlo.

Se il problema dell'elemento non corrispondente deriva dal codice che viene generato in fase di esecuzione dal codice macro e quindi non è presente nel programma di origine, quindi accendo l'opzione mfile per scrivere il codice del passaggio di dati generato in un file e quindi eseguire lo script perl contro quel codice.

Ho scelto perl per le sue forti capacità di adattamento dei modelli, ma qualsiasi altro linguaggio di adattamento dei modelli dovrebbe funzionare bene. Spero che questo aiuti.

È sempre possibile emettere un comando di chiusura delle istruzioni inviate e reinoltrare ciò che si sta tentando di eseguire.

volevo solo ribadire il suggerimento di AFHood di usare l'istruzione ODS _ALL_ CLOSE; . Questa è una chiave da includere. E assicurati di usarlo ogni volta che hai finito con ODS comunque.

La chiusura della sessione SAS ha funzionato nel mio caso. Penso che puoi provarlo una volta prima di provare altri metodi menzionati qui.

Sì, credo che la documentazione SAS ufficiale raccomandi la soluzione che hai proposto per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top