我需要把网上下载的金融数据库的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;