能否从SAS EG服务器会话FTP传输ZIP文件夹?及异常问题求助
问题分析
你遇到的核心问题有两个:一是ODS Package生成的ZIP文件在SAS内用pipe解压显示无数据;二是FTP传输后ZIP文件损坏或为空。本质原因是二进制文件(ZIP)被错误地用文本模式处理,加上FTP传输逻辑未正确读取源文件内容。
解决思路与步骤
一、先验证ODS Package生成的ZIP有效性
先确认服务器上的ZIP文件本身是否正常,直接调用系统命令检查:
filename checkzip pipe 'unzip -l /sascode/user/file.zip'; data _null_; infile checkzip; input; put _infile_; run; filename checkzip clear;
- 如果命令能列出
file.csv,说明ZIP本身有效,问题出在后续解压或FTP步骤; - 如果仍显示空,排查原CSV文件是否存在、SAS进程是否有目录读写权限。
二、正确的FTP传输方法
你之前的FTP代码未读取源ZIP内容,导致传输空文件。必须用二进制模式完整复制源文件:
/* 定义源ZIP(二进制无格式) */ filename sourcezip "/sascode/user/file.zip" recfm=n; /* 定义FTP目标(强制二进制模式) */ filename destftp ftp 'test.zip' host='node.company.com' user='my-user-id' pass='abc123' binary recfm=n; /* 二进制逐块复制文件 */ data _null_; infile sourcezip recfm=n; file destftp recfm=n; input buffer $char1024.; put buffer $char1024.; run; filename sourcezip clear; filename destftp clear;
关键注意点:
- 源文件和FTP目标都指定
recfm=n(无格式,避免文本模式的换行符转换); - FTP语句必须加
binary参数,禁止自动转换文件格式。
三、SAS内正确解压ZIP文件
方法1:调用系统unzip命令(最可靠)
直接用服务器系统工具解压,避免SAS内部处理的格式问题:
filename unzippipe pipe 'unzip /sascode/user/file.zip -d /sascode/user/unzipped/'; data _null_; infile unzippipe; input; put _infile_; run; filename unzippipe clear;
前提是SAS服务器有unzip命令执行权限。
方法2:用SAS原生ZIP引擎(SAS 9.4+支持)
高版本SAS可直接读取ZIP内文件,无需解压:
filename zipfile zip "/sascode/user/file.zip"; /* 读取ZIP中的file.csv */ data extracted_data; infile zipfile(file.csv) dlm=','; /* 根据你的CSV分隔符调整 */ input col1 col2 col3; /* 替换为实际列名/格式 */ run; filename zipfile clear;
四、排查ODS Package生成逻辑
如果ZIP本身为空,先验证原CSV文件:
filename csv_file "/sascode/user/file.csv"; data _null_; infile csv_file obs=5; /* 读取前5行确认内容 */ input; put _infile_; run; filename csv_file clear;
同时检查/sascode/user/目录的读写权限,确保SAS进程能访问该路径下的文件。
内容的提问来源于stack exchange,提问作者brown twelve
相关产品推荐
相关产品推荐

