使用SAS将SAS数据导出到FTP

使用SAS将SAS数据导出到FTP,sas,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.

我想将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数据集。谁能帮帮我吗


谢谢大家!

查看您的代码,您似乎忘记了&ftp\u user.和&ftp\u pass周围的引号(“)。 否则你的代码对我来说没问题

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


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

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

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


注意:如果您在服务器上,则需要验证您是否具有“x”权限;这通常会被锁定。如果您没有,则可能无法完全从SAS运行此操作。

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

%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
的许多优点之一是复制整个数据集,包括可能存在的任何索引。此外,您还可以避免在与创建数据集的操作系统不同的操作系统上使用数据集时出现问题。

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;

事实上,我会用另一种方式 在本地导出文件,然后使用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);

非常感谢Joe!你的回答真的很有帮助。我会自己尝试实施你的一些建议。如果我失败了,我可以再次请求你的帮助。谢谢Shorack的回答。但我认为问题不是你提到的。@user697363好吧,这是我最好的猜测。遗憾的是,我现在没有合适的环境来测试一点m你自己去弄清楚。
%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);