SAS中文论坛

标题: 求助,压缩数据 [打印本页]

作者: shiyiming    时间: 2011-4-5 21:25
标题: 求助,压缩数据
形式类似如Ex的数据,约5000变量,10000条,直接导出为txt文件有100M左右,因为SAS里面把缺失值当空格了,如果去掉空格,在非常小,约1/10左右。

有人建议把数值变量全部转化为字符,这样可以么 ?

写出代码,谢谢!


data ex;
input  var1-var4;
cards;
1  2  3   5
2  .   .   .
3  4  5   .
;
run;
作者: shiyiming    时间: 2011-4-5 23:05
标题: Re: 求助,压缩数据
[code:1a2fciec]data ex;
    input var1-var4;
cards;
1 2 3 5
2 . . .
3 4 5 .
;
data temp(keep=obs var_name var_val);
    length var_name $32 var_val $11;
    set ex;
    array arr _numeric_;
    obs=_n_;
    do over arr;
        var_name=vname(arr);
        var_val=ifc(missing(arr),'',put(arr,best8.2 -l));
        output;
    end;
run;
proc transpose data=temp out=out(drop=obs _name_);
    id var_name;
    by obs;
    var var_val;
run;[/code:1a2fciec]
作者: shiyiming    时间: 2011-4-6 09:07
标题: Re: 求助,压缩数据
谢谢Hopewell。

这个不是SAS的问题, 后来找人用C++做 了。
作者: shiyiming    时间: 2011-4-6 23:47
标题: Re: 求助,压缩数据
我记得SAS的dataset有个compress选项,能压缩不少。
作者: shiyiming    时间: 2011-4-8 03:55
标题: Re: 求助,压缩数据
compress= option only works with SAS dataset, not the desired TXT output

here is my experiment, hope that it helps to sxlion. Check the file size of ex1.txt and ex.txt (9.57MB vs. 19.1MB), 50% missing.
but my question here is that if you completely omit blank space for missing values, how could u recover those missing data in the right positions?


[code:ue6dtzw7]
data ex;
     array var{1000};
         do id=1 to 1e4;
            do j=1 to dim(var);
           if ranuni(0)<0.5 then var[j]=floor(ranuni(0)*10);
                   else var[j]=.;
                end;
                keep var:;
                output;
         end;
run;

data _null_;
     file "c:\ex.txt"  dlm='09'x;
         set ex;
         put var1-var4;
run;
data _null_;
     file "c:\ex1.txt"  dlm=' ';
         set ex;
         array var{1000};
         do j=1 to dim(var);;
            if var[j]^=. then put var[j] @@;
         end;
run;
[/code:ue6dtzw7]
作者: shiyiming    时间: 2011-4-8 12:17
标题: Re: 求助,压缩数据
遇到这种情况,我向来是加分隔符,然后用7zip来压缩。
不过用bin等十六进制文本保存,最精简。估计你c++干的应该是这个活儿。
作者: shiyiming    时间: 2011-4-8 14:56
标题: Re: 求助,压缩数据
oloolo, 由于每条记录中值缺失的变量都是放后面位置(当然你这个更通用些), 所以无需担心位置问题,读的时候用missover就行了.

我在你的代码中给每条记录加了一回车符,这样position也明确了。

[code:2f9zv0mv]data _null_;
     file "c:\ex1.txt"  dlm=' ';
    set ex;
    array var{1000};
    do j=1 to dim(var);
       if var[j]^=. then  put var[j] @@;
           if j=dim(var)  then put  '0D'x;           
    end;  
run;[/code:2f9zv0mv]

现在的问题是由于DLM有空格符 (默认也是,好像是必须有的,改不了),每条记录最后一个空格,如何去除 ?
作者: shiyiming    时间: 2011-4-8 23:35
标题: Re: 求助,压缩数据
sxlion,不是很明白你的意思
也许你要的是不指定DLM=,而是自己通过PUT语句来有控制地设置分隔符?
而且因为你的输出都是单值的整数,也许分隔符根本就不需要,只需要指定断句符号就行了,这样更压缩
作者: shiyiming    时间: 2011-4-9 01:03
标题: Re: 求助,压缩数据
我不是计算机出身,所以只能这个给个参考。具体hex什么方式更好,我不太专业。

[quote:17bm48w4]data _null_;
file 'j:\fileout.txt';
do i=1 to 1000000;
put   '1 2 3 4 5 6 7 8';
end;
run;

data a;
infile 'j:\fileout.txt';
input a b c d e f g h;
run;
data _null_;
set a;
file 'j:\fileout.dat';
  put @1 a PIB1.
      @2 b PIB1.
      @3 c PIB1.
      @4 d PIB1.
      @5 e PIB1.
      @6 f PIB1.
      @7 g PIB1.
      @8 h PIB1.
  ;
run;

[/quote:17bm48w4]

没有dlm肯定省事儿,而且再读入和之前输出不用控制位置,那种中间得留白的那种。
不用7zip压缩的源输出文件省百分之四十一点七。
作者: shiyiming    时间: 2011-4-9 07:50
标题: Re: 求助,压缩数据
K哥凶猛啊  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2011-4-9 15:43
标题: Re: 求助,压缩数据
谢谢各位!

每个变量不一定是一位数,也可能是多位数,oloolo的方法已经基本上解决问题,压缩数据的目的达到。

不过就是每行最后剩下一个空格(你用记事本打开,移到最后,然后移动左右方向键,可知),我想把它去掉,试了各种hex,未果。 后来发现SAS里面的dlm必须有的。

super K哥的hex不错,也起到了压缩数据的目的,减小了41.2%,至于其他压缩比更高的hex也许存在,也许不存在  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 。
作者: shiyiming    时间: 2011-4-9 17:53
标题: Re: 求助,压缩数据
你可以直接采用浮点数据格式,所有计算机数据范畴全部支持。根据情况你可以决定比如说双精度数值所占用字节,直接写入。
这个的好处是,因为16进制的东西本来就是受字节限制,所以根本就不用dlm,而且读取和写入效率应该是最高的。这方面sas应该是C。
作者: shiyiming    时间: 2011-4-10 01:36
标题: Re: 求助,压缩数据
16位压缩,牛
作者: shiyiming    时间: 2011-4-10 14:59
标题: Re: 求助,压缩数据
楼上两位大侠又在取笑我。

以我的计算机水平,也就那么回事儿。
我的理解是,8字节或者16字节的表示比十进制的要节俭,起码连小数点都能省,而且计算机读取写入效率应该高,除此之外,应该没什么。
可能节俭也就是这么回事儿。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2