楼主: tangb
3413 18

[程序分享] 怎样将数据集的变量传递给data 步的控制变量。例如:循环终止值? [推广有奖]

  • 30关注
  • 0粉丝

svip1

教授

12%

还不是VIP/贵宾

-

威望
0
论坛币
11137 个
通用积分
0
学术水平
3 点
热心指数
5 点
信用等级
0 点
经验
13207 点
帖子
437
精华
0
在线时间
1900 小时
注册时间
2009-8-27
最后登录
2024-4-8

200论坛币
我需要把网上下载的金融数据库的csv 文件分拆成以每家公司为单位的年数据集。由于从网上下载的csv文件长短不一,所谓长短不一,指的是包括数量不等的公司年数据。另外,我可能会面临处理许多个这样的csv文件(这个csv的数量我手工填,不用编程)。


我的目标:把这些CSV文件放在一个PC文件夹里。编号1-N。然后,运行程序。将这多个文件(这次是16个)中的67家公司分解开,并形成67个数据集,统一编号,放在一个文件夹内。



下面是我的半手工的两段程序。2段程序的最后输出是:16个文件夹里放着总数为67个 文件名重复的 公司数据集。程序结束后,我要在操作系统下,再次把他们改名,并放到一个文件夹里。很蠢。




第一段:我手工把这些文件放在不同的文件夹里,目前是16个,也就是说,这次我从网上下载了16个csv文件。困境是,在形成公司的文件时,我无法把这16个文件中的67家公司连续编号,所以出此下策。我只好手工修改每次的子文件夹地址,运行这段程序。读入一个csv文件,并计数这个文件包含的公司数目。真蠢!干了2个小时。

filenumber 指:我事先编好的csv文件号:data1-data16.虽然用了do语句,其实每次只运行一遍。本来想编个通用的,发现实在费劲,所以暂时放弃,拿到网上来求大家帮忙!




macro
company_sepereation (filenumber,filename);
%do number=16 % to &filenumber;

/*程序中间的 data16  都是手工改的,一共改了16次。*/

data data16.sample;
informat
RIC
$9.
date date10. /* $10. ddmmyy10.*/
Time
$10./* time10.1 */
M 4.
type $5.
price 4.
Bidprice 4.
askprice 4.
QUALIFIERS $29.
;

infile
"D:\Copy of data\data16\&filename&number..csv" firstobs=2 missover dsd;
input RIC $ DATE $ Time $ M type $ PRICE BIDPRICE Askprice QUALIFIERS $@;
run;

/*按照公司代码,编上顺序号*/
proc sort data=data16.sample;
by ric;
run;

data data16.sample1;
set data16.sample;
by ric;
if first.ric=
1 then do;
companynum+
1;
output data16.sample1 ;
end;
else do
companynum=companynum;
output data16.sample1;
end;
run;

/*通过形成每个公司摘一条记录的方法,形成一个计数数据集*/

data data16.samplecompanycount;
set data16.sample1;
by companynum;
if first.companynum=
1;
run;
data _null_;
set data16.samplecompanycount end=last;
if last then do;

/*输出这个计数,以便我可以手工利用这个计数*/
put _n_=;
end;
run;
%end;
%mend ;

%company_sepereation (
16,data);

Run;


第二段程序,转到19楼。




关键词:控制变量 Data 数据集 anycount filename 运行程序 数据库 文件夹 手工 网上
沙发
tangb 发表于 2009-9-1 12:59:29 |只看作者 |坛友微信交流群
是不是得用 symput 子程序。还有没有别的方法。汇总一下

使用道具

藤椅
sushe1527 发表于 2009-9-1 13:11:39 |只看作者 |坛友微信交流群
最好贴出一段数据和要求 后来人修改下就行

使用道具

板凳
tangb 发表于 2009-9-1 13:21:09 |只看作者 |坛友微信交流群
这个是个方法论贴,具体程序,我已经用那个365个傻循环给绕过去了。我现在想让sas自己决定外循环多少圈,而不是简单设成365 。好像是可以。但不用宏技术,到底怎样根据表里的数据变量,传递给sas的控制变量呢?

这个很想那个无限数据的问题。

使用道具

报纸
tangb 发表于 2009-9-1 13:26:02 |只看作者 |坛友微信交流群
%macro sites (data=, var=);
proc sort data=&data(keep=&var)
out=values nodupkey;
by &var;
run;
data _null_;
set values end=last;
call symputx('site'||left(_n_),location);
if last then call symputx('count',_n_);
run;
%put _local_;


类似这样

使用道具

地板
tangb 发表于 2009-9-1 13:27:04 |只看作者 |坛友微信交流群
data
%do i=1 %to &count;
&&site&i
%end;
;
set &data;
select(&var);
%do i=1 %to &count;
when("&&site&i") output &&site&i;
%end;
otherwise;
end;
run;
%mend sites;
%sites(data=perm.schedule, var=location)

使用道具

7
asteriod 发表于 2009-9-1 13:34:29 |只看作者 |坛友微信交流群
网上Google下“Using a SAS® Table to Drive Any Macro”这篇文章,用这个宏,可以用数据集或excel驱动任何宏。根据你数据集的条数,就是循环次数。

使用道具

8
tangb 发表于 2009-9-1 14:06:41 |只看作者 |坛友微信交流群
好文章!收藏!

使用道具

9
horace_chen 发表于 2009-9-1 14:11:29 |只看作者 |坛友微信交流群
可以参考这篇文章《Changing Data Set Variables into Macro Variables》

使用道具

10
sushe1527 发表于 2009-9-1 14:18:20 |只看作者 |坛友微信交流群
102-2008.pdf (94.01 KB)

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-21 12:41