如何在SAS中编写自动打开文件的批处理文件?

时间:2016-02-08 00:21:06

标签: sas

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

数据中有一个变量,比如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;

3 个答案:

答案 0 :(得分:1)

我不知道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,也许它可以帮到你。

答案 1 :(得分:1)

听起来你在问如何在文本文件中生成一系列OS命令?您可以使用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 :(得分:1)

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

%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;