J'ai besoin de SAS pour lire de nombreux fichiers journaux volumineux, qui sont configurés pour avoir les activités les plus récentes en bas. Tout ce dont j'ai besoin est la dernière fois qu'une activité particulière s'est produite, et je me demandais s'il était possible pour SAS d'ignorer l'analyse des parties (longues) du début du fichier. J'ai regardé en ligne et trouvé comment lire un jeu de données en arrière, mais cela exigerait que SAS commence par analyser tout d'abord le fichier .log dans le jeu de données. Est-il possible de lire directement le fichier à partir de la fin afin que je puisse arrêter l'étape de données dès que je trouve l'activité la plus récente d'un type particulier? Je lis aussi sur infile, et l'option firstobs, mais je n'ai aucune idée de la durée de ces fichiers journaux jusqu'à ce qu'ils soient analysés, n'est-ce pas? On dirait un catch-22 pour moi. Alors est ce que je décris faisable?SAS - Lecture d'un fichier en arrière?
Répondre
Je définirais probablement une instruction de nom de fichier pour utiliser une commande de système d'exploitation telle que tail -r
ou tac
pour présenter le fichier dans l'ordre inverse de SAS. De cette façon SAS peut lire le fichier normalement et vous n'avez pas à vous soucier de la longueur du fichier.
Si vous voulez analyser un fichier journal sas, je ne suis pas sûr que lire le fichier journal en arrière en vaut la peine en pratique. Par exemple, le code suivant s'exécute moins d'un dixième de seconde sur mon PC et il écrit et lit un fichier journal de 10 000 lignes. Quelle est la taille de vos fichiers journaux et combien y en a-t-il? Aussi, comme indiqué ci-dessous, vous n'avez pas à "analyser" tout sur chaque ligne. Vous pouvez lire de manière sélective certaines parties de la ligne et si ce n'est pas ce que vous recherchez, vous pouvez simplement passer à la ligne suivante.
%let pwd = %sysfunc(pathname(WORK));
%put pwd=&pwd;
x cd &pwd;
/* test file. more than 10,000 line log file */
data _null_;
file "test.log";
do i = 1 to 1e4;
r = ranuni(0);
put r binary64.;
if r < 0.001 then put "NOTE: not me!";
end;
put "NOTE: find me!";
do until (r<0.1);
r = ranuni(0);
put r binary64.;
end;
stop;
run;
/* find the last line that starts with
NOTE: and get the rest of the line. */
data _null_;
length msg $80;
retain msg;
infile "test.log" lrecl=80 eof=eof truncover;
input head $char5. @;
if head = "NOTE:" then input @6 msg $char80.;
else input;
return;
eof:
put "last note was on line: " _n_ ;
put "and msg was: " msg $80.;
run;
/* on log
last note was on line: 10013
and msg was: find me!
*/