【问题标题】:Storing SAS data (including table structure) in a single flat file将 SAS 数据(包括表结构)存储在单个平面文件中
【发布时间】:2010-09-12 07:20:46
【问题描述】:

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

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

附加信息:

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

标准 SAS 表、传输文件、XPORT 文件等都是二进制格式文件,SAS 和 CSV 文件中的标准 XML 表格式不保留表结构。所以显然这些选项没有帮助。

我最好的选择是什么?

【问题讨论】:

  • 请问您为什么需要这个?听起来这个问题假定了解决更大问题的部分方法。有了更多的上下文,就有可能提出更好的整体解决方案。
  • 我的应用程序有一些小型配置数据。我想让这些数据跟随我的应用程序源代码下游,通过将它们签入我的修订控制系统。我已经构建了一个应用程序,可以将我的二进制格式元素(例如各种目录条目)转换为平面文件格式,反之亦然。这个自制系统是围绕二进制元素的数量和平面文件元素的数量一一对应的概念构建的。

标签: sas flat-file table-structure


【解决方案1】:

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

http://support.sas.com/documentation/cdl/en/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 技术支持 (support@sas.com) 可能会提供一些帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在问题下查看我的评论。
    【解决方案3】:

    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
      );
    

    【讨论】:

      【解决方案4】:
      1. 创建代码以将表格导出为文本(这很简单,只需在 Google 上搜索或查看“The Little SAS Book”,如果您有副本)。

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

      您并没有完全具体说明您希望如何查看文本文件中的元数据,所以我可以做到这一点。

      【讨论】:

      • 我其实就是用这个把我的表数据导出到MySQL的
      【解决方案5】:

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

      可能:

      1. 使用 PROC EXPORT 生成包含数据的 CSV 文件。
      2. 将 PROC DATASETS 与 ODS 结合使用以生成具有名称、类型等的数据集。
      3. 为此数据集生成另一个 CSV 文件。

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

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 2018-02-21
        • 2015-12-17
        • 2022-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        相关资源
        最近更新 更多