出处:http://www.oceantribe.org/vb/showthread.php?p=32458

options nosource nonumber nodate nonotes nomprint error=10;
/* ============================BeginningOfHeader===============================
/ 名称: Wind2FinData
/ 功能: 将Wind.NET证券行情日数据(*.DAY)导入FinData逻辑库中的cnhq等行情数据集。
/ 版本: 2.0
/ 下载: http://www.sasfans.com
/ 作者: www.sasfans.com
/ 日期: 2006-7-28
/ 备注:
/ 所需模块: Base SAS
/ 测试环境: SAS 9.1.3
/ 用法:
/     如果未安装Wind.NET,请先从http://www.wind.com.cn下载Wind.NET终端,历史数据,数据安装工具.
/     1)安装Wind.NET;2)安装历史数据;3)修改本程序参数.
/     根据注释修改程序末尾有关参数后提交执行,执行前请确认指定逻辑库已经存在.
/     变量含义:
/     dm:证券代码
/     rq:日期
/     kp:开盘价,单位:元
/     zg:最高价,单位:元
/     zd:最低价,单位:元
/     sp:收盘价,单位:元
/     sl:成交量,单位:股
/     je:成交金额,单位:元
/ 修改:
/     
/-------------------------------------------------------------------------------
/ 声明:本代码按现状("AS IS")提供,没有任何明确或隐含的担保,用户自己须承担使用本代码的
/ 风险。授予用户使用或复制本代码的权限,可以将其用于任何用途,只要在所有副本中包
/ 含以上说明及本声明。
/===============================EndingOFHeader=================================*/
%macro Wind2FinData(DataDir,TargetLib);
%if %sysfunc(substr(&DataDir,%length(&DataDir),1)) ^= \ %then %let DataDir =&DataDir.\;

%if %sysfunc(exist(&TargetLib..cnhq))=0 %then  %do; /*目标数据集不存在*/
proc sql;
create table &TargetLib..cnhq (dm char(8) format=$8. label='代码',
rq num   format=YYMMDD10. informat=YYMMDD10.     label='日期',kp num  label='开盘',zg num  label='最高',
zd num  label='最低',sp num  label='收盘',sl num  label='成交数量',
je num  label='成交金额');
quit;
%end;
%if %sysfunc(exist(&TargetLib..cnjjjz))=0 %then  %do; /*目标数据集不存在*/
proc sql;
create table &TargetLib..cnjjjz (dm char(8) format=$8. label='代码',
rq num  format=YYMMDD10. informat=YYMMDD10.  label='日期',jz num  label='单位净值');
quit;
%end;
%let DataDir=%upcase(&DataDir);
    /*将DataDir目录下的文件名导入数据集filelist*/
filename files pipe "dir ""&DataDir""  /b ";
data filelist;
format file_name $30. dm $8. targetdataset $30. tds $40.  maxrq yymmdd10.;
infile files;
input @1 file_name;
file_name=upcase(trim(file_name));
if length(file_name)<10 then delete;
%*处理STOCK\DAY目录,股票/基金/债券/权证/指数等;
%if %index(&DataDir,STOCK\DAY)>0 %then %do;
dm=substr(file_name,length(file_name)-5,2)||substr(file_name,1,length(file_name)-7);
if substr(file_name,length(file_name)-5,6) in ('SH.DAY','SZ.DAY') then do;
if prxmatch(prxparse("/(SH60[0-8]\d{3})|(SH90\d{4})|(SZ00[01256789]\d{3})|(SZ20\d{4})|(SZ4[02]\d{4})/"),dm) then targetdataset='cnhq';/*股票*/
else if prxmatch(prxparse("/(SH00000\d)|(SH00001[0-6])/"),dm) then targetdataset='cnhq';/*沪市指数*/
else if prxmatch(prxparse("/(SH[012]\d{5})|(SZ1[0123]\d{4})/"),dm) then targetdataset='cnhq';/*债券*/
else if prxmatch(prxparse("/(SH5[01]\d{4})|(SZ184\d{3})|(SZ1[56]\d{4})/"),dm) then targetdataset='cnhq';/*基金*/
else if prxmatch(prxparse("/(SH58\d{4})|(SZ03\d{4})/"),dm) then targetdataset='cnhq';/*权证*/
else if prxmatch(prxparse("/(SH000\d{3})|(SZ399\d{3})|(SH8[013]\d{4})/"),dm) then targetdataset='cnhq';/*指数*/
else delete;  /*其它代码删除*/
if dm='SH000300' then targetdataset='cnhq';
end;
else
delete;
%end;
%*处理INDEX\DAY目录,非交易所编制指数;
%else %if %index(&DataDir,INDEX\DAY)>0 %then %do;
dm=substr(file_name,index(file_name,'.')+1,index(file_name,'.DAY')-index(file_name,'.')-1 )||substr(file_name,1,index(file_name,'.')-1);
targetdataset='cnhq';
%end;
%*处理FUND\DAY目录,基金净值数据;
%else %if %index(&DataDir,FUND\DAY)>0 %then %do;
if index(file_name,'NV.')<=0 then delete;
dm=substr(file_name,length(file_name)-5,2)||substr(file_name,1,index(file_name,'NV.')-1);
targetdataset='cnjjjz';
%end;
%*处理OC\DAY目录,代办股份转让系统数据;
%else %if %index(&DataDir,OC\DAY)>0 %then %do;
dm='SZ'||substr(file_name,1,length(file_name)-7);
targetdataset='cnhq';
%end;
targetdataset=lowcase(targetdataset);
tds="&TargetLib.."||targetdataset;
*保存当前代码对应的最新日期;
maxrq=.;
run;
/*获取证券代码的最新数据日期,追加数据时利用该日期只追加更新的数据*/
proc sql noprint;
create table tmpTargetDS as
select distinct ('select dm,max(rq) format=yymmdd10. as maxrq from '|| tds || ' group by dm') as sql,tds
from filelist;
quit;
data tmpTargetDS;
set tmpTargetDS;
if exist(tds)=1;
run;
proc sql noprint;
select sql into :sqlexe separated by ' union  '  from tmpTargetDS;
%if &SQLOBS >0 %then %do;
create table tmpMaxDate as &sqlexe ;
update filelist as f set maxrq = (select maxrq from tmpMaxDate as t where f.dm=t.dm);
drop table tmpMaxDate;
%end;
drop table tmpTargetDS;
quit;

/*将数据集filelist中每个文件名对应文件的数据导入临时数据集WindDayTmp,并追加到指定数据集中*/
%let dsid=%sysfunc(open(filelist));
%if (&dsid=0) %then %do;
%put MSG=%sysfunc(sysmsg());
%abort abend;
%end;
%let i=0;
%do %while (%sysfunc(fetch(&dsid))=0);
  %let i=%eval(&i+1);
  %let DataFile =%sysfunc(trim(  %sysfunc(getvarC(&dsid,%sysfunc(varnum(&dsid,file_name))))  ));
  %let dm =%sysfunc(trim(  %sysfunc(getvarC(&dsid,%sysfunc(varnum(&dsid,dm))))  ));
  %let targetdataset =%sysfunc(trim(  %sysfunc(getvarC(&dsid,%sysfunc(varnum(&dsid,targetdataset))))  ));
  %let maxrq =%sysfunc(trim(  %sysfunc(getvarN(&dsid,%sysfunc(varnum(&dsid,maxrq))))  ));
  /*读各种数据*/
  %if %index(cnhq,&targetdataset)>0 %then %do;
data WindDayTmp(drop=roundoffunit);
infile "&DataDir.&DataFile" recfm=f lrecl=28 STOPOVER;
format dm $8.;
dm="&dm";
input rq ib4. kp float4. zg float4. zd float4. sp float4.
je float4. sl float4.;
if dm in:('SH50','SH51','SZ184','SZ15','SZ16','SH58','SZ03') and rq>mdy(3,3,2003) then roundoffunit=0.001;
else roundoffunit=0.01;
kp=round(kp,roundoffunit);
zg=round(zg,roundoffunit);
zd=round(zd,roundoffunit);
sp=round(sp,roundoffunit);
sl=round(sl*100,1);/*成交量单位为股*/
je=round(je*1000,0.01);/*成交额单位为元*/
rq=mdy(int(mod(rq,10000)/100),mod(rq,100),int((rq/10000)));/* yyyymmdd to sas date*/
attrib rq format=yymmdd10. informat=yymmdd10. ;
if rq <= &maxrq then delete; /*只追加新数据*/
run;
  %end;
  /*读基金净值数据*/
  %else %if %index(cnjjjz,&targetdataset)>0 %then %do;
data WindDayTmp;
format dm $8. rq yymmdd10.;
retain i;
if _n_=1 then i=0;
infile "&DataDir.&DataFile" recfm=n end=eof;
input @(i*8+1) rq ib4. @(i*8+5) jz float4.;
i=i+1;
if eof then stop;
if rq>0 and jz >0 then do;
dm="&dm";
rq=mdy(int(mod(rq,10000)/100),mod(rq,100),int((rq/10000)));/* yyyymmdd to sas date*/
jz=round(jz,0.0001);
if (rq <= &maxrq) then delete; /*只追加新数据*/
end;
drop i;
if eof then stop;
run;
  %end;
    proc append base=&TargetLib..&targetdataset data=WindDayTmp;
run;
proc sql noprint;
drop table winddaytmp;
quit;
    %put  &i. . %sysfunc(putn(%sysfunc(time()),time.)), &DataFile.   =>  &dm , %sysfunc(putn(&maxrq,yymmdd10.));
%end;
%let rc=%sysfunc(close(&dsid));

%mend;

*调用例子;
%Wind2FinData(C:\Wind\Wind.NET.Client\WindNET\data\HQ\OC\Day,FinData);
%Wind2FinData(C:\Wind\Wind.NET.Client\WindNET\data\HQ\Fund\Day,FinData);
%Wind2FinData(C:\Wind\Wind.NET.Client\WindNET\data\HQ\Stock\Day,FinData);

读取WIND数据(行情、基金净值等)的SAS程序相关推荐

  1. matlab获取基金数据,读取WIND数据(行情、基金净值等)的SAS程序

    Code: options nosource nonumber nodate nonotes nomprint error=10; /* ============================Beg ...

  2. python读取大智慧数据_大智慧数据读取接口 大智慧股票本地数据读取接口

    大智慧数据读取接口 大智慧股票本地数据读取接口 时间:2020-7-28 1:42:29 点击: 核心提示:所属分类:C资源描述:组件方法和属性说明:(1)方法GetData语法:public str ...

  3. 利用Python读取外部数据文件

    不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数据可 ...

  4. 利用python进行股票分析(五)通过tushare读取股票数据

    文章目录 5. 通过tushare读取股票数据 5.1. 切换pip3的源 5.2. 获取股票数据 5.2.1. 前复权和后复权 5.2.2. 读取tushare数据,保存到csv文件 5.2.3. ...

  5. python怎么读取sav格式_利用Python读取外部数据文件

    利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...

  6. TensorFlow csv读取文件数据(代码实现)

    TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...

  7. SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题...

    转:http://blog.csdn.net/miragesky2049/article/details/7204882 SharePoint2010沙盒解决方案基础开发--关于TreeView树形控 ...

  8. Kinect V1读取图像数据(For Windows)

    Kinect V1读取图像数据(For Windows) 这篇博客 Kinect V1介绍 数据读取的基本流程 运行代码和注释 结尾 这篇博客  刚好有一台现成的Kinect V1相机,所以就拿过来学 ...

  9. C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组

    转自:http://hi.baidu.com/ctralt/blog/item/cde79fec87f841302697911c.html fstream提供了三个类,用来实现c++对文件的操作.(文 ...

  10. 图像数据读取及数据扩增方法

    Datawhale干货 作者:王程伟,Datawhale成员 本文为干货知识+竞赛实践系列分享,旨在理论与实践结合,从学习到项目实践.(零基础入门系列:数据挖掘/cv/nlp/金融风控/推荐系统等,持 ...

最新文章

  1. 简单文件传输协议TFTP分析还原
  2. 看 Netty 在 Dubbo 中如何应用
  3. 使用userdel命令删除Linux用户
  4. 利用tcpdump抓取mysql sql语句
  5. 42、Power Query-Text.Remove函数应用
  6. vue 生产word_nodejs(officegen)+vue(axios)在客户端导出word文档
  7. int signed in mysql_【转】mysql 中int类型字段unsigned和signed的区别
  8. 比dropout更好的方法_比较自己的更好方法
  9. 史上最全AI开源项目集结,近万篇附代码的论文分门别类整理好
  10. Android功耗优化(7)---如何分析wakelock(wakeup source)持锁问题
  11. c语言基于easyX樱花特效,C++基于easyx图形库实现推箱子游戏
  12. 【转】正则表达式括号的作用
  13. epson l201 l200清零软件 中文版 l111 l101清零软件 L350 L353 清零软件
  14. 移动的宽带修改电信的服务器地址,移动宽带无法登录的解决方法(修改dns让移动等宽带更快--移动宽带的资费享受电信般的快感)...
  15. java打开教程,jar文件打开教程
  16. 2023重庆科技学院计算机考研信息汇总
  17. html5 打字机效果,逼真的js打字机效果插件
  18. Android简单实现计时和倒计时
  19. 弘辽科技:如何拉免费流量的几个小妙招 。
  20. Flink 的背压机制(Back Pressure)

热门文章

  1. Sketch软件51.3 51.2 50.2 50 52 53 54 55 56 57 58正版激活码序列号 支持在线升级
  2. C语言实现万年历记事本,简单实用的layui日历标注记事本代码
  3. 汽车自动驾驶技术与产品研发仿真测试软件—panosim(一)
  4. vue实现pdf预览
  5. ldap统一用户认证php,Docker搭建OpenLDAP+phpLDAPadmin统一用户认证的方法
  6. 网络舆情监测在教育行业的必要性
  7. oracle基本操作语句大全
  8. 前端机器人流程设计的最佳实践:输入输出文件结构和逻辑框架
  9. 常见反爬虫手段及应对策略
  10. Android 实现最新QQ登陆页面