首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用PROC导出时,如何阻止SAS向每个字符串变量添加额外的空字节?

当我使用PROC导出时,如何阻止SAS向每个字符串变量添加额外的空字节?
EN

Stack Overflow用户
提问于 2015-06-10 20:48:29
回答 2查看 572关注 0票数 7

当我使用PROC EXPORT将数据集导出为Stata格式时,SAS9.4会自动展开,为每个字符串变量的每个观察添加一个额外的(空)字节。例如,在此数据集中:

代码语言:javascript
复制
data test1;
    input cust_id   $ 1
          month       3-8
          category  $ 10-12 
          status    $ 14-14
;
datalines;
A 200003 ABC C
A 200004 DEF C
A 200006 XYZ 3
B 199910 ASD X
B 199912 ASD C
;
quit;

proc export data = test1
    file = "test1.dta"
    dbms = stata replace;
quit;

在最终的Stata文件中,变量cust_idcategorystatus应该是str1str3str1,因此每个观察结果分别占1字节、3字节和1字节。但是,SAS会自动为每个观察添加一个额外的空字节,这会将它们的数据类型扩展到输出的Stata文件中的str2str4str2数据类型。

这非常有问题,因为这是一个额外的字节,添加到每个字符串变量的每个观察中。对于大型数据集(我有大约5.3亿个观察值和大量字符串变量),这可以将几千兆字节添加到导出的文件中。

将文件加载到Stata中后,Stata中的compress命令可以自动删除这些空字节并缩小文件,但是对于大型数据集,PROC EXPORT向文件中添加了太多额外的字节,因此我并不总是有足够的内存将数据集加载到Stata中。

是否有一种方法可以阻止SAS首先填充字符串变量?当我导出一个带有一个字符串变量(例如)的文件时,我希望该变量作为一个字符串变量存储在输出文件中。

EN

回答 2

Stack Overflow用户

发布于 2015-10-04 14:10:28

这就是使用现有函数的方法。

代码语言:javascript
复制
filename FT41F001 temp;
data _null_;
   file FT41F001;
   set test1;
   put 256*' ' @;
   __s=1;
   do while(1);
      length __name $32.;
      call vnext(__name);
      if missing(__name) or __name eq: '__' then leave;
      substr(_FILE_,__s) = vvaluex(__name);
      putlog _all_;
      __s = sum(__s,vformatwx(__name));
      end;
   _file_ = trim(_file_);
   put;
   format month f6.;
   run;

避免使用_FILE_;

代码语言:javascript
复制
data _null_;
   file FT41F001;
   set test1;
   __s=1;
   do while(1);
      length __name $32. __value $128 __w 8;
      call vnext(__name);
      if missing(__name) or __name eq: '__' then leave;
      __value = vvaluex(__name);
      __w = vformatwx(__name);
      put __value $varying128. __w @;
      end;
   put;
   format month f6.;
   run;
票数 1
EN

Stack Overflow用户

发布于 2015-10-04 11:22:04

如果您愿意接受一个平面文件的答案,我想出了一个非常简单的方法来生成一个我认为具有所需属性的方法:

代码语言:javascript
复制
data test1;
    input cust_id   $ 1
          month       3-8
          category  $ 10-12 
          status    $ 14-14
;
datalines;
A 200003 ABC C
A 200004 DEF C
A 200006 XYZ 3
B 199910 SD  X
B 199912 D   C
;
run;

data _null_;
file "/folders/myfolders/test.txt";
set test1;
put @;
_FILE_ = cat(of _all_);
put;
run;

/* Print contents of the file to the log (for debugging only)*/
data _null_;
 infile "/folders/myfolders/test.txt";
 input;
 put _infile_;
run;

如果数据集中的所有变量的总分配长度小于32767 (数据步骤环境中的cat函数的限制--以下200个字符限制不适用,因为只有在使用cat创建一个未分配长度的变量时,才能这样做)。除此之外,您可能会开始遇到截断问题。当这种情况发生时,一个解决办法是一次只将有限数量的变量放在一起--这是一个手动过程,但比根据所有变量的长度写出put语句要困难得多,而且取决于您的数据,它可能永远不会出现。

或者,您可以选择更复杂的宏路径,从vlength函数或dictionary.columns获取变量长度,并使用这些变量名来构造所需的put语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30767028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档