SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1342|回复: 13
打印 上一主题 下一主题

求助,压缩数据

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-4-5 21:25:40 | 只看该作者

求助,压缩数据

形式类似如Ex的数据,约5000变量,10000条,直接导出为txt文件有100M左右,因为SAS里面把缺失值当空格了,如果去掉空格,在非常小,约1/10左右。

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

写出代码,谢谢!


data ex;
input  var1-var4;
cards;
1  2  3   5
2  .   .   .
3  4  5   .
;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-4-5 23:05:23 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-4-6 09:07:13 | 只看该作者

Re: 求助,压缩数据

谢谢Hopewell。

这个不是SAS的问题, 后来找人用C++做 了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-4-6 23:47:14 | 只看该作者

Re: 求助,压缩数据

我记得SAS的dataset有个compress选项,能压缩不少。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-4-8 03:55:16 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-4-8 12:17:59 | 只看该作者

Re: 求助,压缩数据

遇到这种情况,我向来是加分隔符,然后用7zip来压缩。
不过用bin等十六进制文本保存,最精简。估计你c++干的应该是这个活儿。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-4-8 14:56:08 | 只看该作者

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有空格符 (默认也是,好像是必须有的,改不了),每条记录最后一个空格,如何去除 ?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-4-8 23:35:24 | 只看该作者

Re: 求助,压缩数据

sxlion,不是很明白你的意思
也许你要的是不指定DLM=,而是自己通过PUT语句来有控制地设置分隔符?
而且因为你的输出都是单值的整数,也许分隔符根本就不需要,只需要指定断句符号就行了,这样更压缩
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-4-9 01:03:33 | 只看该作者

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压缩的源输出文件省百分之四十一点七。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-4-9 07:50:29 | 只看该作者

Re: 求助,压缩数据

K哥凶猛啊  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 14:37 , Processed in 0.087791 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表