【问题标题】:How to write batch file in SAS that automates the opening of files?如何在 SAS 中编写自动打开文件的批处理文件?
【发布时间】:2016-02-08 00:21:06
【问题描述】:

我被分配了一个我不知道从哪里开始的任务。这是上下文:

数据中有一个变量,比如 VAR1,表示一堆图像文件的目录。所以对于观察 1,VAR1 可能看起来像 D:\Project\Data\Images\Image1.tiff 等等。当然,那些图像文件存在于计算机中。

我需要做的是找出 SAS 程序,然后使用批处理文件自动运行它们。当批处理文件运行时,它会以某种方式一个一个地打开图像文件。 “一个接一个”,我的意思是它首先打开一个图像文件,然后在关闭该文件时,它会打开下一个图像文件,直到列表末尾。

更好的是,批处理文件会复制原始图像文件并将它们放在某个文件夹(例如 D:\Project\Data\Temp 图像)中,然后再打开它们。那是为了确保原始数据不受影响。

你知道我如何在 SAS 中编写这样的程序吗?我得到了以下 SPSS 文件以供参考,它可以很好地完成这项工作。我对 SPSS 了解得不够多,无法理解它是如何工作的每一个细节。 dir5和tiff5这两个变量指定了图片文件的位置,变量SCQID和ohhscqid只是ID变量。

    string out2 (a200).

    compute out2=concat('copy "', ltrim(rtrim(dir5)),"\", tiff5, '"',' "c:\temp\temp.tiff"').

    write outfile='E:\Data\Outcome.bat'/'@echo SCQ ID  ' ohhscqid .

    write outfile='E:\Data\Outcome.bat'/out2.

    write outfile='E:\Data\Outcome.bat'/'@"C:\Program Files\Microsoft Office\Office14\OIS.exe" "c:\temp\temp.tiff"'.

execute.

我做了功课,并想出了一种我想要的方法。虽然不是编程的最佳方式,但想法是这样的。

data batwide;set have;
echo = '@echo SCQ ID '||ohhscqid;
predir = 'copy '||'"'||strip(dir5)||strip('\')||strip(tiff5)||strip('"');
preexec = '@'||strip('"')||strip('C:\Program Files\Microsoft Office\Office14\OIS.exe')||strip('"');
temp = '"'||strip('c:\temp\temp.tiff')||strip('"');
run;

data batwide; set batwide;
dir = catx(' ',predir,temp);
exec = catx(' ',preexec,temp);
run;

data batlong;set batwide;
format bat $200.;
bat = echo;output;
bat = dir;output;
bat = exec;output;
keep bat;
run;

data _null_;
set batlong;
file "E:\SAS codes and files\batchfile.bat";
put bat;
run;

【问题讨论】:

  • 这不是 SAS 基本代码。请告诉我们它是什么。可能你忘记了标签。

标签: sas


【解决方案1】:

听起来您在问如何将一系列操作系统命令生成到文本文件中?您可以为此使用 DATA 步。

如果要测试指定的文件是否存在,请使用FILEEXIST() 函数。

因此,如果您的 SAS 数据集名称为 HAVE 和一个名为 VAR1 的变量,其中包含文件名,那么您可能需要这样的程序:

data _null_;
  set have ;
  file 'E:\Data\Outcome.bat';
  if fileexist(VAR1) then do;
    target=catx('\','D:\Project\Data\Temp images',scan(VAR1,-1,'\'));
    put 'copy ' VAR1 :$quote. target :$quote. ;
    put '"C:\Program Files\Microsoft Office\Office14\OIS.exe" ' target :$quote.;
  end;
  else putlog 'WARNING: File not found. ' VAR1=;
run;

【讨论】:

  • 谢谢,您的解决方案看起来更有效率。
【解决方案2】:

我不了解 SPSS,但会给您一个使用 unix 命令的示例,您可以将它们更改为 Windows 命令,并且可能执行您所描述的操作。 在这个例子中我只会复制一些文件,但是“一个一个打开文件”的逻辑是一样的。您将不得不使用代码并将其调整为 Windows。

首先,我们在 /home/user 目录中寻找 csv 文件。再次,将命令调整为 windows。 这将创建一个包含所有文件的 sas 数据集

filename dirlist pipe "find /home/user/ | grep csv";

data dirlist ;                                               
infile dirlist lrecl=200 truncover;                          
input line $200.;  
file_name = strip(line); 
keep file_name;
run; 

然后我将创建一个带有文件数的宏变量,我将它全部为cntfiles

proc sql noprint;
select count(*) into: cntfiles from dirlist;
quit;
%let cntfiles=&cntfiles;
%put cntfiles=&cntfiles;

我正在做的最后一件事是,我正在循环,逐个获取文件名并将它们复制到一个名为 &copyto 的新宏变量中 此数据步骤 (null) 只会复制文件,如果您想对它们做其他事情,则必须为其编写代码。

%macro process_files;
%let copyto = /home/des/33889897/copyto;
%do i=1 %to &cntfiles;

data _null_;
    set dirlist (firstobs=&i.);
    put file_name=;
    call system("cp -f " || file_name || " &copyto");
    stop;
run;

%end;
%mend process_files;
%process_files;

看看这个link,也许对你有帮助。

【讨论】:

    【解决方案3】:

    我经常使用示例代码来解析目录中的文件列表并从文件名中提取元数据。通常提供一个步骤来生成一系列宏变量,以在宏循环中使用以依次处理每个文件。只需添加文件名的任何子字符串即可提取结构化内容,就像示例中的 datetxt 和日期分配语句一样,其中文件名中包含我要使用的日期戳。

    %let extension=txt;
    filename infiles "c:\a\b\c";
    
    Data List_of_files
         Not_ext
         ;
    Length
     path $255
     filename $255
     extension $10
    ;
     d_open=dopen("infiles") ;
     path=pathname("infiles") ;
     nfiles=dnum(d_open) ;
     do i=1 to nfiles;
                     filename =dread(d_open,i) ;
                     extension=scan(filename,-1,'.') ;
                     datetxt=scan(filename,2,"_");
                     date=input(scan(filename,2,"_"),date9.);
                     if upcase(extension) ne "%upcase(&extension)"
                        then output Not_ext ;
                        else output list_of_files ;
                     end;
     d_open=dclose(d_open) ;
    keep
     filename
     path
     extension
    ;
    Run ;
    filename infiles clear;
    

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 2020-01-27
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多