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

在单个平面文件中存储SAS数据(包括表结构),sas,flat-file,table-structure,Sas,Flat File,Table Structure,我需要将SAS数据表转换为平面文件(或者称为“ASCII文件”,而不是二进制文件)。每个原始SAS表只有一个平面文件。 具有挑战性的是,我希望平面文件也包含原始SAS表的一些结构信息,特别是: 变量/列名 变量/列标签 变量/列类型 变量/列长度 变量/列格式 变量/列信息 其他信息: 我只需要转换小数据(

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

  • 变量/列名
  • 变量/列标签
  • 变量/列类型
  • 变量/列长度
  • 变量/列格式
  • 变量/列信息
其他信息:

  • 我只需要转换小数据(<100 OB)
  • 性能不是问题(在合理范围内)
  • 平面文件应构成重新创建原始SAS表的基础,我不需要在数据或过程步骤中将该文件直接用作表
标准SAS表、传输文件、XPORT文件等都是二进制格式的文件,SAS和CSV文件中的标准XML表格式不保留表结构。所以很明显,这些选择没有帮助


我的最佳选择是什么?

我不知道有什么简单的解决方案

可能:

  • 使用PROC EXPORT生成包含数据的CSV文件
  • 将PROC数据集和ODS一起使用,生成具有名称、类型等的数据集
  • 为此数据集生成另一个CSV文件
  • 现在您已经获得了表的ASCII描述(分布在两个CSV文件上)。逆转这一过程将更加棘手。基本上,您必须读入描述数据集,然后在循环中使用CALL SYMPUT创建一组包含其中信息的宏变量,然后使用宏变量为CSV文件构建过程导入

  • 创建代码以将表导出为文本(这很简单,只要用谷歌搜索它或查看“小SAS手册”(如果你有副本的话)

  • 然后附加sashelp.vcolumn中的“meta”信息,sas在其中存储有关sas数据集的信息(元数据)。它本身是一个sas表,因此您可以执行proc sql union操作将其与该表所描述的实际列连接起来(尽管您需要执行转置类型的操作,因为有关列的元数据是在行中,而不是列中)


  • 关于如何查看文本文件中的元数据,您还没有完全明确,所以我只能这样说。

    proc-sql的descripe语法可能很方便获取元数据部分,包括长度、类型、格式、索引等

    代码:

    日志:


    顺便说一句,你还没有说你为什么要这么做。在这种情况下,没有好的理由(可能有令人信服的理由,比如某个有权力的人) 说“要么做,要么被解雇”,但没有充分的理由)


    我会放弃在每个文件中合并元数据和数据的想法,除非有非常充分的理由这样做。将数据集A的元数据导出到名为metadata_A的文件中;这将导致成对的文件。任何希望在数据库程序或统计程序中使用这些文件的人都会有一个标记明确的元数据文件。

    使用SAS 9.2,您可以从数据集创建XML文件,XML包含变量/列元数据,如格式、标签等。。。请参阅SAS 9.2 XML LIBNAME引擎:用户指南中标题为“使用XML引擎跨操作环境传输SAS数据集”的部分。链接如下:

    下面是手册中的一段代码,说明如何使用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技术支持(support@sas.com)可能会提供一些帮助。

    请问您为什么需要这个?听起来,这个问题似乎是一个更大问题解决方案的一部分。有了更多的上下文,就有可能提出更好的整体解决方案。我有一些小规模的应用程序配置数据。我希望通过将这些数据签入我的修订控制系统,使它们跟随我的应用程序源代码下游。我已经构建了一个应用程序,可以将二进制格式元素(如各种目录条目)转换为平面文件格式,反之亦然。这个自制系统是围绕着二进制元素和平面文件元素的数量之间的一对一对应关系的概念构建的。请参阅我在问题下的评论。我实际上使用这个系统将我的表数据导出到MySQL中
    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
      );
    
    libname myfiles 'SAS-library';
    libname trans xml92 'XML-document' xmltype=export;
    proc copy in=myfiles out=trans;
       select class;
    run;