Quelle est votre meilleure astuce pour sortir d'une condition de devis déséquilibrée dans BASE SAS?

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

  •  01-07-2019
  •  | 
  •  

Question

En tant que programmeur SAS de base, vous connaissez l’exercice:

Vous envoyez votre code SAS, qui contient une citation non équilibrée. Vous disposez donc désormais non seulement d'une citation non fermée, mais également de commentaires non fermés, de définitions de fonctions macro et d'une exécution manquante; ou quittez; déclaration.

Quel est votre meilleur truc pour ne pas vous déranger dans ces citations déséquilibrées?

Était-ce utile?

La solution

guide d'entreprise 3 utilisait la ligne suivante en haut de son code généré automatiquement:

*';*";*/;run;

Cependant, le seul moyen de vraiment "réinitialiser" de toutes sortes de problèmes, il faut quitter la session sas et équilibrer ce qui est déséquilibré avant de soumettre à nouveau le code. L'utilisation de ce type de piratage rapide (pas cher?) Ne résout pas le problème.

au fait, ods _all_ close; ferme toutes les destinations ods, y compris la destination de résultats par défaut. dans une session interactive, vous devez le rouvrir avec résultats ods; ou résultats ods sur; au moins en fonction de la documentation. mais lorsque je l'ai testé sur mon 9.2, cela n'a pas fonctionné, comme indiqué ci-dessous:

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

Autres conseils

Pour ma part, j’ai l'habitude Google pour" devis asymétrique SAS " et aboutit à l'envoi de quelque chose comme this :

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

... pour sortir des commentaires, guillemets et fonctions macro non fermés.

Voici celui que j'utilise.

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

J'ai eu une situation de citations non équilibrées dans une macro et la seule solution consistait à fermer l'instance de SAS et à recommencer.

Je pense que c'est une faille inacceptable dans SAS.

Cependant, j’ai utilisé les méthodes des DEUX 2 et 5 et cela a fonctionné. # 2 d'abord et ensuite # 1. Je les ai mis au-dessus de TOUT le code, y compris mon en-tête de code, en expliquant ce que faisait ce programme.

A travaillé comme un charme.

J'ai écrit un programme Perl qui lit tout programme SAS et enregistre les éléments qui doivent apparaître par paires. Avec des éléments tels que les parenthèses, qui peuvent être incorporées, il affiche le niveau d’imbrication au début de chaque ligne. Il doit être capable de distinguer les parenthèses faisant partie des fonctions macro de celles faisant partie des fonctions d'étape de données, y compris les appels% sysfunc résidant dans l'environnement macro mais appelant des fonctions d'étape de données (doit également faire la même chose pour la macro% syscall invocations de fonctions), mais cela est faisable avec des expressions régulières. Si le niveau d'imbrication devient négatif, c'est un indice que le problème peut être à proximité.

Il commence également à compter les guillemets simples et doubles depuis le début du programme et identifie si le nombre de chaque symbole rencontré est impair ou pair. Comme avec les parenthèses, il doit être capable de distinguer les guillemets faisant partie du code de macros de ceux faisant partie du code d'étape de données ainsi que ceux faisant partie de chaînes littérales telles que O'Riley et% nrstr (% '% " ) et ne pas les compter, mais le filtrage par motif peut aussi le gérer.

Si le problème de l'élément non concordant provient d'un code généré au moment de l'exécution par un code macro et n'est donc pas présent dans le programme source, j'active l'option mfile pour écrire le code d'étape de données généré dans un fichier, puis l'exécuter. le script Perl contre ce code.

J'ai choisi perl pour ses capacités de correspondance de modèles, mais tout autre langage de correspondance de modèles devrait fonctionner correctement. J'espère que cela vous aidera.

Vous pouvez toujours simplement émettre une commande de terminaison des déclarations soumises et soumettre à nouveau ce que vous essayez d'exécuter.

je voulais juste réitérer la suggestion d'AFHood d'utiliser l'instruction ODS _ALL_ CLOSE; . C'est un élément clé à inclure. Et assurez-vous de l’utiliser chaque fois que vous avez terminé avec ODS.

Fermer la session SAS a fonctionné dans mon cas. Je pense que vous pouvez essayer cela une fois avant d’essayer les autres méthodes mentionnées ici.

Oui, je crois que la documentation officielle SAS recommande la solution que vous avez proposée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top