Qual é o seu melhor truque para sair de uma condição Citação desequilibrado em BASE SAS?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Como uma base SAS programador, você sabe o que fazer:

Você envia o seu código SAS, que contém uma citação desequilibrada, então agora você tem não só e citação não fechada, mas também os comentários não fechadas, definições de função macro, e uma corrida faltando; ou sair; declaração.

Qual é o seu melhor truque para não ter aquelas citações desequilibrados te incomoda?

Foi útil?

Solução

guia empresa 3 usado para colocar a seguinte linha na parte superior do seu código gerado automaticamente:

*';*";*/;run;

No entanto, a única maneira de realmente "reset" de todos os tipos de algo problemas desequilibradas é parar a sessão sas, e equilíbrio o que está desequilibrado antes de re-enviar o código. Usando este tipo de rápido (barato?) Hacks não aborda a causa raiz.

aliás, fecha ods _all_ close; todas os destinos ods, incluindo o padrão, os resultados de destino. em uma sessão interativa, você deve abri-lo novamente com ods results; ou ods results on;, pelo menos de acordo com o documention. mas quando eu testei no meu 9.2, não funcionou, como mostrado abaixo:

%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.
*/

Outras dicas

Quanto a mim, eu costumo Google para "Citação desequilibrada SAS" , e acabar com a apresentação de algo como este :

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

... para sair dos comentários não fechadas, citações e funções de macro.

Aqui é o uso que eu.

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

Eu tive uma situação com aspas desequilibradas em uma macro ea única solução foi fechar a instância do SAS e começar de novo.

Eu sinto que é uma falha inaceitável na SAS.

No entanto, eu usei os métodos pelos dois # 2 e # 5 e funcionou. # 2 e, em seguida, primeiro # 1. Eu colocá-los acima código ALL, incluindo o meu cabeçalho código, explicando o que este programa estava fazendo.

Trabalhou como um encanto.

Eu escrevi um programa perl que lê por meio de qualquer determinado programa SAS e mantém o controle das coisas que devem vir em pares. Com coisas como parênteses, que podem ser incorporados, ele imprime o nível de nidificação no início de cada linha. Ele precisa ser capaz de distinguir entre parênteses, que fazem parte de funções de macro daqueles que fazem parte das funções da etapa de dados, incluindo chamadas% sysfunc que residem no ambiente macro mas fazer chamadas para as funções da etapa de dados (também deve fazer semelhante para% syscall macro invocações de função), mas que é factível através de expressões regulares. Se o nível de aninhamento vai negativo, é um indício de que o problema pode estar nas proximidades.

Ele também começa a contar aspas simples e duplas desde o início do programa e identifica se a contagem de cada tal símbolo que ele encontra é par ou ímpar. Tal como acontece com parênteses, ele precisa ser capaz de distinguir citações que fazem parte do código de macro daqueles que fazem parte do código passo de dados e também aqueles que fazem parte de strings literais, como O'Riley e% nrstr (% '% ") e não contá-los, mas a correspondência de padrão pode lidar com isso também.

Se o problema do item incompatíveis decorre de código que é gerado em tempo de execução pelo código de macro e, portanto, não está presente no programa de origem, então eu ligo opção MFILE para escrever o código passo de dados gerado para um arquivo e execute o script perl contra esse código.

Eu escolhi perl por causa de suas fortes capacidades de correspondência de padrão, mas qualquer outra língua pattern-matching deve funcionar bem. Espero que isso ajude.

Você sempre pode apenas emitir um cessar comandar declarações apresentadas e reenvie o que você está tentando executar.

só queria reiterar a sugestão de AFHood usar a instrução ODS _ALL_ CLOSE;. Essa é uma pergunta chave para incluir. E certifique-se de usá-lo cada vez que você terminar com ODS de qualquer maneira.

Fechando a Sessão SAS trabalhou no meu caso. Eu acho que você pode tentar fazer isso uma vez antes de tentar outros métodos mencionados aqui.

Sim, eu acredito que a documentação oficial SAS recomenda a solução que propusemos para si mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top