我想将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数据集。任何人都可以帮助我。
谢谢!
答案 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);