在单个平面文件中存储SAS数据(包括表结构)

时间:2020-03-06 14:35:16  来源:igfitidea点击:

我需要将SAS数据表转换为平面文件(或者称为ASCII文件的文件,而不是二进制文件)。每个原始SAS表只有一个平面文件。
具挑战性的事情是,我希望平面文件也包含原始SAS表的一些结构信息,特别是:

  • 变量/列名
  • 变量/列标签
  • 变量/列类型
  • 变量/列长
  • 变量/列格式
  • 变量/列信息

添加信息:

  • 我只需要转换小数据(<100 obs)。
  • 性能不是问题(在合理范围内)。
  • 平面文件应构成重新创建原始SAS表的基础,我不需要能够直接将文件用作DATA或者PROC步骤中的表。

标准SAS表,传输文件,XPORT文件等都是二进制格式的文件,SAS和CSV文件中的标准XML表格式不保留表结构。因此,这些选项显然无济于事。

我最好的选择是什么?

解决方案

如果仅在SAS中使用数据,则可以使用PROC COPY制作传输文件:

http://www.usc.edu/isd/doc/statistics/sas/sastransport/

我不知道有任何简单的解决方案。

可能:

  • 使用PROC EXPORT生成包含数据的CSV文件。
  • 将PROC DATASETS与ODS结合使用以生成具有名称,类型等的数据集。
  • 为该数据集生成另一个CSV文件。

现在,我们已经获得了该表的ASCII描述(分布在两个CSV文件中)。逆转该过程将更加棘手。基本上,我们必须读入描述数据集,然后在循环中使用CALL SYMPUT来创建一堆包含其中信息的宏变量,然后使用宏变量为CSV文件构建PROC IMPORT ...

  • 创建代码以将表导出为文本(这很简单,只需将其搜索一下,如果有副本,请查看" The Little SAS Book")。
  • 然后从sashelp.vcolumn添加"元"信息,该位置是sas存储有关sas数据集的信息(元数据)的地方。它本身是一个sas表,因此我们可以执行proc sql union操作,以将其与该表描述的实际列连接起来(尽管我们将需要执行转置类型操作,因为有关列的元数据位于行中,而不是列中)。

我们对要在文本文件中查看元数据的方式并不确定,所以就我所知。

proc sql的describe语法对于获取元数据部分(包括长度,类型,格式,索引等)可能很方便。

代码:

proc sql;
describe table sashelp.class;
quit;

日志:

NOTE: SQL table SASHELP.CLASS was created like:

create table SASHELP.CLASS( bufsize=4096 )
  (
   Name char(8),
   Sex char(1),
   Age num,
   Height num,
   Weight num
  );

顺便说一句,我们还没有说明为什么需要这样做。在这种情况下,没有充分的理由(可能有令人信服的理由,例如有权力的人
说"做,还是被开除",但没有充分的理由)。

我会放弃合并每个文件中的元数据和数据的想法,除非有非常强烈的理由要这样做。将数据集A的元数据导出到名为metadata_A的文件中;这将导致文件配对。希望在数据库程序或者统计程序中使用这些文件的任何人都可以使用带有清晰标签的元数据文件。

使用SAS 9.2,我们可以从数据集创建XML文件,并且XML包含变量/列元数据,例如格式,标签等。请参见SAS 9.2 XML LIBNAME Engine:用户指南,标题为"使用XML"跨操作环境传输SAS数据集的引擎"。链接到这里:

http://support.sas.com/documentation/cdl/zh-CN/engxml/61740/HTML/default/a002594382.htm

这是手册中的代码部分,显示了如何使用XML92 libname引擎和PROC COPY创建XML:

libname myfiles 'SAS-library';
libname trans xml92 'XML-document' xmltype=export;
proc copy in=myfiles out=trans;
   select class;
run;

在SAS 9.1.3中,我们可能必须创建一个自定义标签集才能获得相同的操作。 SAS技术支持([email protected])可能会提供一些帮助。