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

Mic*_*l A 7 sas stata

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

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;
Run Code Online (Sandbox Code Playgroud)

变量cust_id,, categorystatus应该是str1,str3并且str1在最终的Stata文件中,因此每次观察分别占用1个字节,3个字节和1个字节.然而,SAS自动添加到每个观测,其扩展了它们的数据类型到一个额外的空字节str2,str4str2在输出Stata的文件数据类型.

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

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

有没有办法阻止SAS首先填充字符串变量?当我导出一个带有一个字符串变量的文件时(例如),我希望该变量存储为输出文件中的一个字符串变量.

use*_*489 0

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

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;
Run Code Online (Sandbox Code Playgroud)

这应该按原样工作,前提是数据集中所有变量的总分配长度小于 32767(cat数据步骤环境中函数的限制 - 下限 200 个字符限制不适用,因为只有当您用于cat创建尚未分配长度的变量)。除此之外,您可能会开始遇到截断问题。发生这种情况时的解决方法是cat一次仅组合有限数量的变量 - 这是一个手动过程,但比根据所有变量的长度编写 put 语句要省力得多,并且根据您的数据,它可能永远不会真正出现向上。

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