楼主: tangb
2671 13

大家帮忙看看? 这个程序怎样传递变量? [推广有奖]

  • 30关注
  • 0粉丝

svip1

教授

12%

还不是VIP/贵宾

-

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

楼主
tangb 发表于 2009-9-4 17:37:05 |AI写论文
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;

关键词:anycount filename missover informat company 程序 变量 帮忙

沙发
tangb 发表于 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;

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

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

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

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

报纸
tangb 发表于 2009-9-4 18:03:23
我希望,那位能够用, 我们另外的讨论贴得方法,建立宏传递。

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

7
tangb 发表于 2009-9-5 07:49:01
谢谢提醒。其实写长变量名不是我的习惯,这两天搞得程序分支太多,只好临时想一个。真个程序还未优化,现当时草稿吧。但字确实不该写错。 已经开始出现楼上讲的问题了。后面要注意了。

8
tangb 发表于 2009-9-6 16:53:27
每人可以做出来吗?

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

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

最好减少人工干预。拿到什么文件马上运行程序是最理想的。
那么可否将CSV文件变成文本数据格式文件(.TXT),用SAS程序直接调用文本文件,然后处理呢?

10
tangb 发表于 2009-9-7 18:53:24
走集成数据的路子肯定不行。而且sas数据 一大 就 出古怪毛病。

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

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