使用SAS复制文本文件

使用SAS复制文本文件,sas,Sas,是否有SAS程序/功能可用于将文本文件从一个位置复制到另一个位置 当然,这可以通过使用操作系统命令(%sysexec copy)来实现,但肯定有一种与操作系统无关的方法来实现吗 通过查看文档,我可以看出,proc copy(或proc cport)仅与SAS文件相关。似乎有答案 /* these IN and OUT filerefs can point to anything */ filename in "c:\dataIn\input.xlsx"; filename out "c:\da

是否有SAS程序/功能可用于将文本文件从一个位置复制到另一个位置

当然,这可以通过使用操作系统命令(%sysexec copy)来实现,但肯定有一种与操作系统无关的方法来实现吗

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

似乎有答案

/* 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;

谢谢Chris,最简单的方法是:

 data _null_;
    infile 'c:\input.txt';
    file 'c:\output.txt';
    input;
    put _infile_;
 run;
RawFocus提供的方法将以二进制形式将任何文件从输入复制到输出,每次复制一个字节。对于文本文件,这是不必要的,执行上述操作将一次复制一行文件。您可能需要稍微注意记录长度,我认为默认记录长度是256,因此您可能需要输入一个显式的

 lrecl=32767
infle
语句中的选项或类似选项,如

infile 'c:\input.txt' lrecl=32767;

对于SAS 9.4和forward,请使用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());

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

Raw,您现在应该能够将答案标记为正确-可能需要,否则这看起来像是未回答:)此外,我建议你将此添加到FAQ中,因为这是一个普遍需要的概念(IMO,对于“普通”的定义非常有限)。完成-谢谢Joe-我有点想先确保没有“更好”的答案,如果是这样的话,我会觉得有点厚脸皮地将我自己的答案标记为“正确”!另外-你说的“将此添加到FAQ”指的是什么?我指的是对FAQ工作原理的不准确理解:)即使对于文本文件,使用
recfm=n
的另一个好处是,如果文本文件有长行,它将被完整地复制,而不是LRECL中的内容。此方法的唯一问题是它假定了目标目标文件已存在。此宏将执行以下操作: