5

是否有可用于将文本文件从一个位置复制到另一个位置的 SAS 程序/函数?

当然,这可以使用操作系统命令(%sysexec 复制)来实现,但肯定有一种与操作系统无关的方法来做到这一点吗?

从我通过查看文档可以看出,proc copy(或proc cport)仅与SAS文件有关。

4

3 回答 3

10

最简单的方法是这样的:

 data _null_;
    infile 'c:\input.txt';
    file 'c:\output.txt';
    input;
    put _infile_;
 run;

RawFocus 提出的方法可以将任何文件以二进制形式从输入一次一个字节地复制到输出。对于文本文件,这不是必需的,执行上述操作将一次复制文件一行。您可能需要稍微注意记录长度,我相信默认记录长度是 256,因此您可能需要明确

 lrecl=32767

声明中的选项或类似内容infile,如

infile 'c:\input.txt' lrecl=32767;
于 2012-10-25T07:35:49.620 回答
6

似乎Chris Hemedinger有答案!

/* these IN and OUT filerefs can point to anything */
filename in "c:\dataIn\input.xlsx"; 
filename out "c:\dataOut\output.xlsx"; 

/* copy the file byte-for-byte  */
data _null_;
  length filein 8 fileid 8;
  filein = fopen('in','I',1,'B');
  fileid = fopen('out','O',1,'B');
  rec = '20'x;
  do while(fread(filein)=0);
     rc = fget(filein,rec,1);
     rc = fput(fileid, rec);
     rc =fwrite(fileid);
  end;
  rc = fclose(filein);
  rc = fclose(fileid);
run;

filename in clear;
filename out clear;

谢谢克里斯

于 2012-10-24T09:20:06.797 回答
4

对于 SAS 9.4 及更高版本,请使用 FCOPY 函数。使用 recfm=n(n 表示无或二进制)执行真正的复制。

filename src "path-to-src" recfm=n;
filename dst "path-to-dst" recfm=n;
%let rc = %sysfunc(FCOPY(src,dst));
%put %sysfunc(SYSMSG());

如果文件引用不使用 recfm=n 选项,FCOPY 会将它们视为文本文件,因此会受到控制字符和文件结束标记的影响。

于 2015-10-01T20:50:34.077 回答