4

I wanted to export SAS dataset from SAS into FTP. I can export csv file (or txt file) using the following command:

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

But couldn't use it to export SAS dataset. Can anybody please help me.

Thank you!

4

5 回答 5

6

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

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

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

于 2013-07-08T14:15:27.947 回答
4

正如乔所说,您不使用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是复制整个数据集,包括可能存在的任何索引。此外,您还可以避免在与创建它的操作系统不同的操作系统上使用数据集相关的问题。

于 2013-07-08T15:08:03.503 回答
2

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;
于 2018-03-25T18:16:10.223 回答
1

查看您的代码,您似乎忘记了 &ftp_user. 和 &ftp_pass 周围的引号 (")。否则,您的代码在我看来没问题。

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

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

于 2013-07-08T12:45:32.663 回答
1

实际上,我会以另一种方式在本地导出文件,然后使用 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);
于 2018-05-16T13:25:16.637 回答