SAS: Как удалить выходные файлы запроса (.sasbdat7 & .log) при выходе из программы или макросом? - PullRequest
0 голосов
/ 24 февраля 2020

Я получил указание вручную удалить выходные файлы перед выполнением нового запроса. Похоже, это можно сделать как макрос или как системную настройку, которую я еще не обнаружил. Вы знаете, как это сделать?

1 Ответ

0 голосов
/ 24 февраля 2020

Это распространенная проблема, возникающая при использовании полупостоянных библиотек. Как правило, пространство каталога WORK выделяется с меньшим пространством, чем пространство каталога полупостоянной библиотеки. В этих случаях полупостоянное пространство каталогов намного больше и может быть более легко использовано для больших временных таблиц. Также легко оставить старые файлы позади, но есть хорошие методы, которые вы можете использовать, чтобы уменьшить это.

Когда вы запускаете большую программу SAS, которая имеет много разных файловых зависимостей, рассмотрите возможность использования трех разных пробелов:

  1. Временное хранилище - Временные файлы, которые не должны сохраняться после текущего сеанса. В SAS это каталог WORK.
  2. Полупостоянное хранилище - Временные файлы, которые очень велики или должны сохраняться после текущего сеанса, но могут быть легко воссозданы без каких-либо простоев, если приходит злой системный администратор и говорит, что ему нужно пространство как можно скорее
  3. Постоянное хранилище - файлы, которые имеют решающее значение для производственного процесса и потребуют значительных усилий для воссоздания или создания серьезного простоя

Работа с данными

При создании программ SAS, которые хранят временные таблицы в полупостоянном пространстве, создайте систему именования файлов, которая легко идентифицирует временные таблицы по префиксам. Например, любые таблицы, которые вы не хотите сохранять на постоянной основе, можно ставить с подчеркиванием. В конце каждой программы вы можете удалить эти временные таблицы с помощью proc datasets:

proc datasets lib=templib nolist;
    delete _:;
quit;

Ваш префикс может быть настолько простым или сложным, насколько вы захотите. Если у вас нет такого типа системы, вам нужно будет вручную указать каждый набор данных в proc datasets:

proc datasets lib=templib nolist;
    delete dataset1
           dataset2
           dataset3 
    ;
quit;

Работа с журналами

Журналы в SAS всегда временны, если вы не скажете, чтобы они были где-то написаны. Если они всегда записываются где-то из-за вашей настройки, было бы неплохо иметь временный архив, сохраненный с помощью метки времени. Иногда вы не найдете ошибку до 4 недель спустя. Ваш системный администратор может создать скрипт для архивации или удаления старых файлов через определенное время.

Если это невозможно, у вас есть два способа иметь дело с ним напрямую в SAS:

1. Использование команды x

x должно быть включено и позволяет запускать команды ОС прямо через SAS. Допустим, вы работаете на Linux. Вы можете удалить все файлы, заканчивающиеся на .log, с помощью этой строки:

x 'rm /my/directory/*.log';

Если у вас не включены команды x, все становится немного сложнее. Вы можете сделать это напрямую через SAS с шагом data.

2. Использование программы SAS

SAS имеет набор функций файлов / папок, которые позволяют выполнять такие операции, как копирование, вставка, получение атрибутов файла и т. Д. c. Приведенная ниже программа удалит все файлы, заканчивающиеся на .log внутри папки.

/* Put your filename here without ending slash.
   If in Windows, change to \ 
*/
%let directory = /my/directory;
filename mydir "&directory";

data _null_;
    length filename $1000.;

    /* Open the directory and assign a Directory ID */
    did = dopen("mydir");

    /* Read every file name in the directory */
    do i = 1 to dnum(did);

        filename = dread(did, i);

        /* If the the filename ends in .log, then delete it */
        if(upcase(scan(filename, -1, '.'))) = 'LOG' then do;

            /* If in Windows, change to \ */
            rc = filename('logfile', cats("&directory./", filename));
            rc = fdelete('logfile');
        end;
    end;

    /* Close the directory */
    rc = dclose(did);
run;

Включение этого в макрос и сохранение его в sasautos позволит вам вызывать его в другом месте (например, %cleanLogs(directory=/my/directory); ).

...