SAS PROC IMPORT 未按照命令创建 OUT 数据集
SAS PROC IMPORT not creating OUT dataset as commanded
情况:我正在使用 PROC IMPORT 导入 xlsx 文件并希望将数据发送到新的 netezza 数据库 table。
我的问题:SAS 似乎 运行 正常,但日志显示一个完全不同的 table name was been created with a libref that I'我没有使用(并且这个 libref 被清除)。
LIBNAME abc sasionza server=server database=db port=123 user=user pass=pass;
PROC IMPORT
OUT = abc.DesiredTableName
DATAFILE= "my/excelfile/file.xlsx"
DBMS=xlsx
REPLACE;
SHEET="Sheet1";
GETNAMES=YES;
RUN;
这个"runs"就好了,或者看起来是这样。我检查了日志,我看到了这个:
NOTE: The import data set has 11 observations and 7 variables.
NOTE: xyz.ATableCreatedDaysAgoInAnotherProgram data set was successfully created. NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.55 seconds
cpu time 0.02 seconds
我想,嗯,这很奇怪。 libref xyz 实际上被清除了,所以我不可能使用它,并且 ATableCreatedDaysAgoInAnotherProgram 是一个 tablename 用于完全不同的我正在进行的 SAS E-Guide 程序。
听起来像是内存或缓存问题。因此,我关闭了 SAS E-Guide 的所有实例并启动了一个新实例。我创建了一个只有我想要的行的新程序(上面列出的代码)。
它 运行s,结果我得到以下日志:
NOTE: The import data set has 11 observations and 7 variables.
NOTE: WORK._PRODSAVAIL data set was successfully created.
NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.55 seconds
cpu time 0.02 seconds
我会注意到,这是我第一次实际尝试使用 PROC IMPORT 将内容直接发送到 netezza table。到目前为止,我总是将文件导入到 WORK 中,并在将它们插入数据库中的 table 之前对它们进行一些处理。我认为这可能是我可能不知道的 SAS 限制,但是 PROC IMPORT (https://v8doc.sas.com/sashtml/proc/z0308090.htm) 的 SAS 文档说您可以在 OUT 语句中指定两级名称,所以我觉得这应该工作。如果它 不能 工作,那么我觉得 SAS 应该出错而不是随机创建一个我什至没有在我的代码中执行的 table 名称。
总结 (tl;dr):您能否使用 libref 将 PROC IMPORT 直接导入 netezza 数据库 table?如果你不能,为什么我的代码执行和生成的文本甚至与我正在做的事情无关?
谢谢大家!
解决方案:正在导入的 xlsx 文件中的一列在其中一个列名中有一个 space... 只需删除列名中的 space 并将更改保存到 xlsx 文件,就可以完美地执行上面的 PROC IMPORT 代码,并将所需的结果导入到命名的 netezza table.
注意:这解决了我的问题,但它没有解释 SAS 日志显示正在执行的文本实际上并不在要执行的代码中。
听起来您应该向 SAS 报告未收到工作错误消息的问题。
为确保您的 SAS/Netezza 表中没有带空格的变量名,请在 运行 您的程序之前更改 VALIDVARNAME 选项的设置。这样 PROC IMPORT 会将 XLSX 文件中的列标题转换为有效的变量名称。
options validvarname=v7;
libname out ...... ;
proc import out=out.table replace ...
情况:我正在使用 PROC IMPORT 导入 xlsx 文件并希望将数据发送到新的 netezza 数据库 table。
我的问题:SAS 似乎 运行 正常,但日志显示一个完全不同的 table name was been created with a libref that I'我没有使用(并且这个 libref 被清除)。
LIBNAME abc sasionza server=server database=db port=123 user=user pass=pass;
PROC IMPORT
OUT = abc.DesiredTableName
DATAFILE= "my/excelfile/file.xlsx"
DBMS=xlsx
REPLACE;
SHEET="Sheet1";
GETNAMES=YES;
RUN;
这个"runs"就好了,或者看起来是这样。我检查了日志,我看到了这个:
NOTE: The import data set has 11 observations and 7 variables.
NOTE: xyz.ATableCreatedDaysAgoInAnotherProgram data set was successfully created. NOTE: PROCEDURE IMPORT used (Total process time): real time 0.55 seconds cpu time 0.02 seconds
我想,嗯,这很奇怪。 libref xyz 实际上被清除了,所以我不可能使用它,并且 ATableCreatedDaysAgoInAnotherProgram 是一个 tablename 用于完全不同的我正在进行的 SAS E-Guide 程序。
听起来像是内存或缓存问题。因此,我关闭了 SAS E-Guide 的所有实例并启动了一个新实例。我创建了一个只有我想要的行的新程序(上面列出的代码)。
它 运行s,结果我得到以下日志:
NOTE: The import data set has 11 observations and 7 variables.
NOTE: WORK._PRODSAVAIL data set was successfully created.
NOTE: PROCEDURE IMPORT used (Total process time): real time 0.55 seconds cpu time 0.02 seconds
我会注意到,这是我第一次实际尝试使用 PROC IMPORT 将内容直接发送到 netezza table。到目前为止,我总是将文件导入到 WORK 中,并在将它们插入数据库中的 table 之前对它们进行一些处理。我认为这可能是我可能不知道的 SAS 限制,但是 PROC IMPORT (https://v8doc.sas.com/sashtml/proc/z0308090.htm) 的 SAS 文档说您可以在 OUT 语句中指定两级名称,所以我觉得这应该工作。如果它 不能 工作,那么我觉得 SAS 应该出错而不是随机创建一个我什至没有在我的代码中执行的 table 名称。
总结 (tl;dr):您能否使用 libref 将 PROC IMPORT 直接导入 netezza 数据库 table?如果你不能,为什么我的代码执行和生成的文本甚至与我正在做的事情无关?
谢谢大家!
解决方案:正在导入的 xlsx 文件中的一列在其中一个列名中有一个 space... 只需删除列名中的 space 并将更改保存到 xlsx 文件,就可以完美地执行上面的 PROC IMPORT 代码,并将所需的结果导入到命名的 netezza table.
注意:这解决了我的问题,但它没有解释 SAS 日志显示正在执行的文本实际上并不在要执行的代码中。
听起来您应该向 SAS 报告未收到工作错误消息的问题。
为确保您的 SAS/Netezza 表中没有带空格的变量名,请在 运行 您的程序之前更改 VALIDVARNAME 选项的设置。这样 PROC IMPORT 会将 XLSX 文件中的列标题转换为有效的变量名称。
options validvarname=v7;
libname out ...... ;
proc import out=out.table replace ...