使用SAS将SAS数据导出到FTP

时间:2013-07-08 11:54:59

标签: sas

我想将SAS数据集从SAS导出到FTP。我可以使用以下命令导出csv文件(或txt文件):

%macro export_to_ftp(dsn= ,outfile_name= );

Filename MyFTP ftp "&outfile_name." 
HOST='ftp.site.com'
                 cd= "&DATA_STRM/QC" 
                  USER=&ftp_user.
                  PASS=&ftp_pass.;

PROC EXPORT DATA= &dsn. OUTFILE= MyFTP DBMS=%SCAN(&outfile_name.,2,.) REPLACE; 
RUN; filename MyFTP clear;
%mend;

%export_to_ftp(dsn=lib1.dataset ,outfile_name=dataset.csv);

但无法用它来导出SAS数据集。任何人都可以帮助我。

谢谢!

5 个答案:

答案 0 :(得分:5)

PROC EXPORT不用于导出SAS数据集,它用于将SAS数据集转换为其他格式。您通常不会使用FTP文件名方法来传输SAS数据集;如果您打算从一台SAS机器转移到另一台SAS机器,您可以使用SAS / CONNECT(如果您需要SAS / CONNECT许可并希望获得帮助,请说明),或使用普通(OS)FTP进程传输文件。技术上可以使用FTP文件名方法传输SAS文件(作为二进制文件,然后逐字节读取),但这容易出错并且过于复杂。

如果您使用SAS来驱动该过程,最好的方法是在您的操作系统中编写FTP脚本,并使用x或%sysmd调用该脚本,并将文件名作为参数传递。如果您包含有关操作系统的信息,可以轻松地绘制一些内容来帮助您。

注意:如果您在服务器上,则需要验证您是否拥有“x”权限;那经常被锁定。如果不这样做,您可能无法完全从SAS运行。

答案 1 :(得分:3)

正如Joe所说,您不使用PROC EXPORT创建要使用FTP传输的文件。交换SAS数据集最安全的方法是使用PROC CPORT创建传输文件。以下是原始宏的修改版本:

%macro export_to_ftp(dsn= ,outfile_name= );

%let DBMS=%UPCASE(%SCAN(&outfile_name.,2,.));

%if &DBMS ne CSV and &DBMS ne TXT and &DBMS ne CPT %then %do;
   %put &DBMS is not supported.;
   %goto getout;
   %end;

%if &DBMS=CPT %then %do;
filename MyFTP ftp "&outfile_name." 
   HOST='ftp.site.com'
   cd= "&DATA_STRM/QC" 
   USER=&ftp_user.
   PASS=&ftp_pass.
   rcmd='binary';
PROC CPORT DATA= &dsn. 
     FILE = MyFTP;
RUN;
%end;

%else %do;
filename MyFTP ftp "&outfile_name." 
   HOST='ftp.site.com'
   cd= "&DATA_STRM/QC" 
   USER=&ftp_user.
   PASS=&ftp_pass.
   rcmd='ascii';

PROC EXPORT DATA= &dsn. 
     OUTFILE= MyFTP 
     DBMS= &dbms REPLACE; 
RUN; 
%end;

filename MyFTP clear;

%getout:

%mend;

%export_to_ftp(dsn=lib1.dataset ,outfile_name=dataset.csv);
%export_to_ftp(dsn=lib1.dataset ,outfile_name=dataset.cpt);

按照惯例,这将使用cpt的文件扩展名来标识您希望创建SAS传输文件。收到该文件的人将使用PROC CIMPORT将文件转换回SAS数据集:

filename xpt 'path-to-transport-file';
proc cimport data=dataset infile=xpt;
run;
filename xpt clear;

请注意,SAS传输文件应作为二进制文件传输;另外两种格式是文本文件;因此,不同的filename陈述。

使用PROC CPORT的许多优点之一是复制整个数据集,包括可能存在的任何索引。此外,您还可以防止与在创建它的操作系统上使用数据集相关的问题。

答案 2 :(得分:1)

OP需要的是到FTP服务器的二进制传输。这可以通过数据步骤来完成。

filename ftpput ftp "<full name of your file with ext>" cd='<DIR>' user='<username>' pass='<password>' host='<ftp host>' recfm=s debug; /*ftp dir stream connection*/
filename myfile '/path/to/your/library/dsfile.sas7bdat' recfm=n; /*local file*/

/*Binary Transfer -- recfm=n*/
data _null_;
n=1;
infile myfile nbyte=n;
input;
file ftpput;
put _infile_ @@;
run;

您可以根据您的规格调整输入/放置语句。但除此之外,这对我有用。

我想,您也可以使用上述文件名尝试fcopy功能。这应该也适用于二元转移。

options nonotes; /*do not want the data step or ftp server notes*/
data _null_;
fcop=fcopy("myfile","ftpput");
if fcop = 0 /*Success code*/ then do;
    put '|Successfully copied src file to FTP!|';
end;
else do;
    msg=sysmsg();
    put fcop= msg=;
end;
run;
options notes;

答案 3 :(得分:0)

查看您的代码,您似乎忘记了&amp; ftp_user。和&amp; ftp_pass周围的引号(“)。 否则你的代码对我来说没问题。

如果这不起作用,一些错误信息会派上用场。

另请注意,使用扫描来确定dbms非常棘手:如果未来的文件名中包含(多个)点会怎么样?最好将-1(最后一个点之后的部分)而不是2(第二个点之后的部分)作为扫描函数的参数。

答案 4 :(得分:0)

我实际上会以相反的方式做到这一点 在本地导出文件,然后使用FTP程序上传 这样的事情:(注意我使用了CSV ..但请使用什么文件格式) 您可能需要稍微编辑一下,但基本逻辑就在那里

%macro export_to_ftp(dsn= ,outfile_name= );
PROC EXPORT DATA= &dsn. OUTFILE= &file_to_FTP..CSV DBMS=%SCAN(&outfile_name.,2,.) REPLACE; 
RUN; 

Filename MyFTP ftp  "c:\FTP_command.bat"
put "ftp &ftp_user.:&ftp_pass.@ftp.site.com "
              put   "cd   &DATA_STRM./QC" 
                 put "c:\&file_to_FTP..CSV ";

 x  "c:\FTP_command.bat";
%mend;

%export_to_ftp(dsn=lib1.dataset ,outfile_name=dataset.csv);