gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:53:21 28 4
gpt4 key购买 nike

当我使用 PROC EXPORT 将数据集导出为 Stata 格式时, 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;

变量 cust_id , category , 和 status应该是 str1 , str3 , 和 str1在最终的 Stata 文件中,因此每次观察分别占用 1 个字节、3 个字节和 1 个字节。但是,SAS 会自动为每个观察值添加一个额外的空字节,从而将它们的数据类型扩展为 str2。 , str4 , 和 str2输出的Stata文件中的数据类型。

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

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

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

最佳答案

这就是您如何使用现有函数来做到这一点。

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

关于sas - 使用 PROC EXPORT 时,如何阻止 SAS 向每个字符串变量添加额外的空字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30767028/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com