楼主: yz7891
4572 11

[原创博文] 来看看 数据分段问题 [推广有奖]

  • 0关注
  • 0粉丝

本科生

86%

还不是VIP/贵宾

-

威望
0
论坛币
18 个
通用积分
0
学术水平
0 点
热心指数
4 点
信用等级
0 点
经验
615 点
帖子
100
精华
0
在线时间
61 小时
注册时间
2010-3-30
最后登录
2019-6-3

楼主
yz7891 发表于 2010-4-22 16:34:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. data a;
  2. set WORK.ABC;
  3. run;
  4. proc sql ;
  5. create table b as
  6. select count(*) as count,*
  7. from a
  8. order by ORG_COL_641298
  9. ;
  10. quit;
  11. data c;
  12. set b;
  13. j=int(count/500)+1;
  14. call symput('j',j);
  15. run;
  16. %macro loop;
  17. %do i=1 %to &j.;
  18. k=(i-1)*500+1;
  19. call symput('k',k);
  20. proc export data=c(firstobs=&k. obs=500);
  21. outfile="D:\ritter\vocceq&k..txt" ;
  22. run;
  23. %end;run;
  24. %mend loop;
  25. %loop;
复制代码
DATA.ABC里有10000+条数据,现在需要每500条一段进行分割,我按照我上面的写法(乱写的)来运行,但是提示&k.那里出错了,我怎么改也不行,不知道各位有什么好方法 或者有没有另外的想法
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:proc sql symput export ritter Create

回帖推荐

jingju11 发表于7楼  查看完整内容

6# soporaeternus 楼上的肯定是正解。只是就yz7891的程序来论:

本帖被以下文库推荐

沙发
crackman 发表于 2010-4-22 16:59:11
data a;
set WORK.ABC;
run;
proc sql ;
create table b as
select count(*) as count,*
from a
order by ORG_COL_641298
;
quit;
data c;
set b;
j=int(count/500)+1;
call symput('j',j);
run;
%macro loop;
data _null_;
do i=1 to &j.;
k=(i-1)*500+1;
end;
call symput('a'||left(i),k);
run;
%do i=1 %to &j.;
proc export data=c(firstobs=&&a&i. obs=500);
outfile="D:\ritter\vocceq&&a&i..txt" ;
run;
%mend loop;
%loop;
已有 1 人评分学术水平 热心指数 收起 理由
醉_清风 + 1 + 1 热心回复

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
crackman 发表于 2010-4-22 17:04:59
你看看行不行
你的程序估计是因为K值时循环得出的
你又循环赋值给宏变量
导致宏变量K就是不稳定的一个对象

板凳
sushe1527 发表于 2010-4-22 19:51:38
data abc;do p=1 to 10000;output;end;run;
data _null;set abc end=a;
if a then call symput('j',ceil(_n_/500));run;
%macro loop;
%do i=1 %to &j ;
data abc&i;
set abc;
if (_n_>500*&i-500 and _n_<500*&i) then output  abc&&i;
run; proc export data=abc&i
outfile="D:\ritter\abc&i..txt";
run;
%end;
%mend loop;
%loop;
已有 1 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

报纸
crackman 发表于 2010-4-22 21:50:43
呵呵
sushe1527
直接改写了代码
可能会解决楼主的问题

地板
soporaeternus 发表于 2010-4-22 22:38:11
  1. data abc;do p=1 to 10001;output;end;run;

  2. data _null_;
  3.         set abc nobs=n;
  4.         call symput("NOBS",n);
  5.         stop;
  6. run;
  7. %put &NOBS;

  8. %MACRO T;
  9.         data _null_;
  10.                 set abc;
  11.                 n+1;
  12.                 %do i=1 %to %sysfunc(ceil(&NOBS/500)) %by 1;
  13.                         %if &i>=2 %then %do;
  14.                                 else
  15.                         %end;
  16.                         if ceil(n/500)=&i then do;
  17.                                 file "e:\hahaha&i..txt";
  18.                                 put p;
  19.                         end;
  20.                 %end;

  21.         run;

  22. %MEND T;
  23. %T;
复制代码
改良下,全表遍历一次,不输出到data,可能会快一点
已有 1 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

Let them be hard, but never unjust

7
jingju11 发表于 2010-4-23 05:54:12
6# soporaeternus

楼上的肯定是正解。只是就yz7891的程序来论:

  1. %macro loop;
  2. proc sort data = work.abc out = b; by ORG_COL_641298; run;
  3. data _null_; call symputx('tot', ceil(nobs/500));
  4. set b nobs = nobs; stop;
  5. run;
  6. %do i = 1 %to &tot;
  7. proc export data = b(firstobs =%eval((&i-1)*500+1) obs = %eval((&i-1)*500+500)) outfile="D:\ritter\vocceq&i..txt" ;
  8. run;
  9. %end;
  10. %mend loop;
  11. %loop
  12. ;
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 收起 理由
bakoll + 3 + 3 精彩帖子
crackman + 1 + 1 精彩帖子

总评分: 经验 + 3  论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

8
醉_清风 发表于 2010-4-23 18:04:51
soporaeternus 发表于 2010-4-22 22:38
  1. data abc;do p=1 to 10001;output;end;run;

  2. data _null_;
  3.         set abc nobs=n;
  4.         call symput("NOBS",n);
  5.         stop;
  6. run;
  7. %put &NOBS;

  8. %MACRO T;
  9.         data _null_;
  10.                 set abc;
  11.                 n+1;
  12.                 %do i=1 %to %sysfunc(ceil(&NOBS/500)) %by 1;
  13.                         %if &i>=2 %then %do;
  14.                                 else
  15.                         %end;
  16.                         if ceil(n/500)=&i then do;
  17.                                 file "e:\hahaha&i..txt";
  18.                                 put p;
  19.                         end;
  20.                 %end;

  21.         run;

  22. %MEND T;
  23. %T;
复制代码
改良下,全表遍历一次,不输出到data,可能会快一点
程序中
%if &i>=2 %then %do;
                                else
                        %end;
是做什么的呢?貌似去掉了也能跑
从来不需要想起 永远也不会忘记

9
yz7891 发表于 2010-4-23 18:25:01
谢谢大家,问题已经解决了,多谢大家了

10
soporaeternus 发表于 2010-4-26 12:53:51
8# 醉_清风
if-else和if效率的问题
Let them be hard, but never unjust

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-18 08:06