当我使用数据集导出数据集时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,, category和status应该是str1,str3并且str1在最终的Stata文件中,因此每次观察分别占用1个字节,3个字节和1个字节.然而,SAS自动添加到每个观测,其扩展了它们的数据类型到一个额外的空字节str2,str4和str2在输出Stata的文件数据类型.
这是非常有问题的,因为这是每个字符串变量的每次观察都添加的额外字节.对于大型数据集(我有一些有大约5.3亿个观测值和众多字符串变量),这可以为导出的文件增加几千兆字节.
将文件加载到Stata后,Stata中的compress命令可以自动删除这些空字节并缩小文件,但对于大型数据集,PROC EXPORT会为文件添加如此多的额外字节,而我并不总是有足够的内存来将数据集加载到Stata首先.
有没有办法阻止SAS首先填充字符串变量?当我导出一个带有一个字符串变量的文件时(例如),我希望该变量存储为输出文件中的一个字符串变量.
如果您愿意接受平面文件答案,我想出了一种相当简单的生成方法,我认为该方法具有您所需的属性:
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语句。