全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3798 18
2009-09-01
悬赏 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楼。




二维码

扫码加我 拉你入群

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

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

全部回复
2009-9-1 12:59:29
是不是得用 symput 子程序。还有没有别的方法。汇总一下
二维码

扫码加我 拉你入群

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

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

2009-9-1 13:11:39
最好贴出一段数据和要求 后来人修改下就行
二维码

扫码加我 拉你入群

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

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

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

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

扫码加我 拉你入群

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

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

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


类似这样
二维码

扫码加我 拉你入群

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

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

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)
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群