2

我在 SQL Server 2008 数据库中有一个表,我想导出到 SAS,这个表有许多数据类型(整数、varchar、float)的列,在正常情况下这个过程会更简单,但我有一个有趣的场景:

我有两台机器:第一台连接到 SQL Server 2008 但它没有安装 SAS 软件,第二台安装了 SAS 软件但它没有连接到 SQL,因此我不能使用 PROC SQL 命令,所以我尝试:

  1. 导出到带有逗号分隔的 CSV:如果我有一个像用户 ID 这样的字段,它通常是一个数字(SAS 将该字段识别为数字)并且 SAS 检测到一个带有字母数字值的记录,我会收到一条错误消息。

    我有一个导致(我猜)错误的列示例:

user_ID
1251231253    ok
5645645642    ok
1111232135    ok
CC19491855    fail
  • 错误消息是这样的:

注意:第 468 行 12-21 中的 user_id 数据无效。
规则:----+----1----+----2----+----3----+----4.....(等等on)
468 70988585,5,CC19491855 , , .... (等等, 等等, 数据, 数据...)

cod_001=70988585 tip_001=5 user_id=CC19491855 ....(等等,等等,数据,数据...)
错误=1 N =467

  1. 使用逗号分隔和带引号的列导出到 CSV:一切正常,我没有错误消息,但所有变量在 SAS 中导出为字母数字。

我是 SAS 的新手,所以如果在导出过程之后有一些方法可以格式化变量就可以了。

4

2 回答 2

1

您目前使用什么将 CSV 导入 SAS?您最好的选择是使用文件->导入数据向导。执行此操作时,它将在日志窗口中生成一些 SAS 代码,如下所示:

data WORK.xx    ;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile 'D:\sasdev\xxx\output\xxx.csv' delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
   informat datetimestamp anydtdtm40. ;
   informat phoneHome best32. ;
   informat phoneCell best32. ;
   informat phoneBusiness best32. ;
   format datetimestamp datetime. ;
   format phoneHome best12. ;
   format phoneCell best12. ;
   format phoneBusiness best12. ;
input
            datetimestamp
            phoneHome
            phoneCell
            phoneBusiness
;
if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro variable */
run;

如果导入向导没有为您提供所需的结果,您可以复制它生成的代码并根据需要进行修改。在我上面的示例中,所有电话号码都被导入为数字。下面我稍微清理了一下代码,把phoneBusiness变量改成了长度为10的字符变量。

data WORK.xx    ;
  infile 'D:\sasdev\xxx\output\xxx.csv' delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;

  informat datetimestamp anydtdtm40. ;
  informat phoneHome best32. ;
  informat phoneCell best32. ;
  informat phoneBusiness $10. ;

  format datetimestamp datetime. ;
  format phoneHome best12. ;
  format phoneCell best12. ;
  format phoneBusiness $10. ;

  input datetimestamp
        phoneHome
        phoneCell
        phoneBusiness $
        ;
run;

编辑/更新:

关于“数据类型”的一些注释。

SAS 中实际上只有两种类型的数据。字符和数字。日期存储为数字数据,但通常格式化为以人类可读的表示形式出现。以下types评论中提到的称为格式/信息。

格式控制数据如何“显示”或“输出”。Informats 控制在用作输入时如何解析数据(例如从文件中读取)。您选择的信息应该代表数据的存储方式。您选择的格式实际上取决于您希望它如何显示。

您可以在此处找到文档:

http://support.sas.com/documentation/cdl/en/leforinforref/63324/HTML/default/viewer.htm#titlepage.htm

上述代码的快速总结 -best12.是一种数字格式,最多可使用 12 个字符的宽度。将best32.使用最多 32 个字符的宽度。这$10.是一种字符格式(由 $ 符号标识),宽度为 10 个字符。

于 2013-01-04T19:09:01.060 回答
0

将您的表从 SQL Server 提取到一个分隔文件中;我建议使用制表符或管道(“|”)而不是逗号。不要在值周围加上引号;使用标准 ISO 日期格式格式化任何 DATE 或 TIME 列。如果可能,请在顶部包含一个包含列名的行。

完成后,您可以使用PROC IMPORT将文件读入 SAS 数据集。 PROC IMPORT只是一个代码生成器,它将检查输入文件并创建适当INPUT的处理语句。

如果您遇到特定错误(正如您在尝试选项 1 时所说的那样),请再次询问或使用确切的错误消息更新此问题。像这样的问题很容易解决。

于 2013-01-04T19:10:03.383 回答