SAS:如何在程序退出时或通过宏删除查询输出文件(.sasbdat7&;log)?

SAS:如何在程序退出时或通过宏删除查询输出文件(.sasbdat7&;log)?,sas,Sas,我被指示在运行新查询之前手动删除输出文件。看起来这可以作为一个宏,或者一个我还没有发现的系统设置来完成。您知道如何做到这一点吗?这是使用半永久性库时出现的常见问题。通常,工作目录空间的分配空间小于半永久性库目录空间。在这些情况下,半永久目录空间要大得多,可以更容易地用于大型临时表。保留旧文件也很容易,但您可以遵循一些好的做法来减少这种情况 当你运行一个大的SAS程序时,它有很多不同的文件依赖性,考虑有三个不同的空间: 临时存储-不需要在当前会话之后保留的临时文件。在SAS中,这是工作目录 半永久

我被指示在运行新查询之前手动删除输出文件。看起来这可以作为一个宏,或者一个我还没有发现的系统设置来完成。您知道如何做到这一点吗?

这是使用半永久性库时出现的常见问题。通常,工作目录空间的分配空间小于半永久性库目录空间。在这些情况下,半永久目录空间要大得多,可以更容易地用于大型临时表。保留旧文件也很容易,但您可以遵循一些好的做法来减少这种情况

当你运行一个大的SAS程序时,它有很多不同的文件依赖性,考虑有三个不同的空间:

  • 临时存储-不需要在当前会话之后保留的临时文件。在SAS中,这是工作目录
  • 半永久性存储-临时文件非常大,或者需要在当前会话结束后保存,但是如果系统管理员生气地说他们需要尽快释放空间,则可以轻松地在不停机的情况下重新创建这些文件
  • 永久存储—对生产过程至关重要的文件,需要花费大量精力重新创建或造成重大停机
  • 处理数据

    在创建在半永久空间中存储临时表的SAS程序时,请创建一个文件命名系统,该系统可以通过前缀轻松标识临时表。例如,任何不希望永久保存的表都可以使用下划线作为前缀。在每个程序结束时,您可以删除带有
    proc数据集的临时表

    proc datasets lib=templib nolist;
        delete _:;
    quit;
    
    proc datasets lib=templib nolist;
        delete dataset1
               dataset2
               dataset3 
        ;
    quit;
    
    前缀可以是简单的,也可以是复杂的。如果没有这种类型的系统,则需要在
    proc datasets
    中手动指定每个数据集:

    proc datasets lib=templib nolist;
        delete _:;
    quit;
    
    proc datasets lib=templib nolist;
        delete dataset1
               dataset2
               dataset3 
        ;
    quit;
    
    处理日志

    SAS中的日志总是临时的,除非您告诉它们要写在某个地方。如果由于您的设置,它们总是写在某个地方,那么最好按时间戳保存它们的临时存档。有时你要到4周后才能发现bug。您的系统管理员可以创建一个脚本,在一定时间后压缩或删除旧文件

    如果不可能,您有两种方法可以直接在SAS中处理此问题:

    1。使用
    x
    命令

    x
    需要启用,并允许您直接通过SAS运行操作系统命令。假设您正在Linux上运行。您可以使用此行删除以
    .log
    结尾的所有文件:

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

    如果没有启用
    x
    命令,事情会变得更加棘手。您可以在
    data
    步骤中通过SAS直接执行此操作

    2。使用SAS程序

    SAS有一套文件/文件夹功能,允许您执行复制、粘贴、获取文件属性等操作。下面的程序将删除文件夹中以
    .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;
    

    将其封装在宏中并保存到
    sasasuts
    空间,您可以在其他位置调用它(例如
    %cleanLogs(directory=/my/directory);
    )。

    这取决于输出文件的位置。如果它们在工作目录中,那么在会话结束后,所有文件都将被自动删除。如果您的日志和数据保存在永久位置,您可以编写一些SAS程序来删除它们。感谢@StuSztukowski,这些文件将保存在其他位置。你认为编写一个程序来删除它们有多困难?我只使用SAS eguide来验证我创建的规则的输出。我有编写javascript和php的丰富经验。该程序是在SAS服务器上运行的存储进程吗?程序(或查询)是否作为程序的批处理执行运行?如何指定输出位置(对于数据集,该位置将是LIBNAME语句中指定的路径,对于ODS输出,该位置可以在ODS语句中指定)