全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2599 13
2009-09-04
悬赏 400 个论坛币 未解决
我需要把网上下载的金融数据库的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;
二维码

扫码加我 拉你入群

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

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

全部回复
2009-9-4 17:38:00
这是第二段程序。

我要开始把这个csv文件拆成公司数据集了。



%macro sepereation (companyname, count);


/*这里的count,就是上个程序的计数器,手工放到宏参数里的*/

%do  number=1 % to &count;

data data16.&companyname&number( keep= ric Date Time TYPE Price Bidprice Askprice Qualifiers ) ;
set data16.sample1;

/*利用上个程序给每个公司的编号,选择一个公司输出,输出的数据集名:companyname 1-n   (这里的n就是这个csv里的公司数目,也就是count的赋值。*/

where companynum= &number;

run;

%end;
%mend ;


%sepereation (companyname,5);




run;
二维码

扫码加我 拉你入群

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

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

2009-9-4 17:52:15
给您提点编程思路,仅供参考:
1、制定一个格式的CSV文档,以公司变量最多的个数设计变量,最好固定下来,其中必须有公司名称代码、月份代码两个变量;
2、导入你下载的数据,如果没有的项目,可作为缺失值;
3、然后按照公司和月份排序,输出生成你要的每家数据库。
运用多个宏嵌套,把任务分割,不容易出错,即使出错了也好寻找出错点。
不知有帮助否?仅供参考
二维码

扫码加我 拉你入群

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

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

2009-9-4 18:02:12
这样做的原因:不是因为csv文件变量异构。而是因为太大。达到csv根本无法装下。也无法一次从网上下载。

而且,如果无法一次从网上下载,而且面临无法控制这些csv的组成(例如公司有固定个数)。

最好减少人工干预。拿到什么文件马上运行程序是最理想的。
二维码

扫码加我 拉你入群

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

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

2009-9-4 18:03:23
我希望,那位能够用, 我们另外的讨论贴得方法,建立宏传递。
二维码

扫码加我 拉你入群

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

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

2009-9-4 21:59:39
5# tangb
%macro sepereation (companyname, count);
指正一下: 你的这个单词sepereation拼写错了。程序一长,这个小东西是最令人头痛的
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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