读取分析家各类数据(包括专业财务数据)的SAS程序

Discussion in 'Julia / MATLAB / SAS' started by zwz, Aug 13, 2006.

  1. zwz

    zwz

    读取分析家数据的SAS程序(且能自动更新FinData数据库数据)的SAS程序 :

    读取分析家各类数据(含专业财务数据)的SAS程序,点击这里下载,或参考这里

    读取分析家部分数据的SAS程序,见下面的代码,也可点击这里下载

    Code:
    options nosource nonumber nodate nonotes nomprint nomlogic noxwait error=10;
    /* ============================BeginningOfHeader===============================
    / 名称: Fxj2FinData
    / 功能: 转换分析家各类数据,并添加到FinData数据库主要数据表.
    /      数据表不同于之前的FxjData2FinData。
    / 版本: 2.0
    / 下载: http://www.sasfans.com
    / 作者: sasfans.com
    / 日期: 2006-7-28
    / 备注: 使用了DSCI hash object和perl正则表达式,只能运行于9.0以上版本;分析家V6.0
    / 所需模块: Base SAS
    / 测试环境: SAS 9.1.3
    / 用法:
    /     根据提示修改尾部参数后运行.
    / 修改:
    /
    /------------------------------------------------------------------------------- 
    / 声明:本代码按现状("AS IS")提供,没有任何明确或隐含的担保,用户自己须承担使用本代 
    / 码的风险。授予用户使用或复制本代码的权限,可以将其用于任何用途,只要在所有副本中
    / 包含以上说明及本声明。 
    /===============================EndingOFHeader=================================*/
    
    %macro Fxj2FinData(Market,DataType,FinDataLib);
    %if %sysfunc(substr(&FxjPath,%length(&FxjPath),1)) ^= \ %then %let FxjPath =&FxjPath.\;
    %let FxjPath=%upcase(&FxjPath);
    %let DataType=%lowcase(%trim(&DataType));
    %let Market=%upcase(&Market);
    %let MarketDir=&Market;
    %let CodePrefix=&Market;
    %if (%sysfunc(libref(&FinDataLib))) %then %let FinDataLib=Work;
    %if &Market=SH | &Market=SZ %then
    	%let FinDataDataSet = %lowcase(&FinDataLib..cn&DataType);
    %else
    	%let FinDataDataSet = %lowcase(&FinDataLib..&Market.&DataType);
    %if &Market=BK %then %do;
    	%let MarketDir=$$;
    %end;
    %let FxjTempFile = %sysget(temp)\FxjFileBySas.tmp;
    %put %sysfunc(time(),time.)  执行 Fxj2FinData(&Market , &DataType , &FinDataLib) ...;
    %let SecCodeRx=/(SH60[0-8]\d{3})|(SH90\d{4})|(SZ00[01256789]\d{3})|(SZ20\d{4})|(SZ4[02]\d{4})|;
    %let SecCodeRx=&SecCodeRx(SH00000\d)|(SH00001[0-6])|(SH[012]\d{5})|(SZ1[0123]\d{4})|;
    %let SecCodeRx=&SecCodeRx(SH5[01]\d{4})|(SZ184\d{3})|(SZ1[56]\d{4})|(SH58\d{4})|(SZ03\d{4})|;
    %let SecCodeRx=&SecCodeRx(SH000\d{3})|(SZ399\d{3})|(SH8[013]\d{4})|(SH000300)/;
    /*---------------------------dm--------------------------------*/
    %if &DataType = dm %then %do;
    %let FxjDataFile = &FxjPath.DATA\&MarketDir\STKINFO51.DAT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (dm char(8) format=$8. label='代码',
    		jc char(20) label='简称');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	data &FinDataDataSet;
    		set &FinDataDataSet.;
    		if dm in:("&market") then delete;
    	run;
    
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	format dm $8.;
    	infile FxjFile recfm=n end=eof;
    	input @9 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=0845898x + 1 + (SecID-1)*248;
    		input @(SecPos+0) dm $8. @(SecPos+10) jc $20.;
    		dm = "&CodePrefix"||dm;
    		dm = compress(dm,byte(0)||' ');
    		jc = compress(jc,byte(0)||' ');
    		if dm in:('SH','SZ') then do;
    			if prxmatch(prxparse("&SecCodeRx"),dm) then output;
    		end;
    		else output;
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep  dm jc ;
    	stop;
    run;
    proc sort data = ResultTable;
    	by dm;
    run;
    %end; 
    /*--------------------------end of dm--------------------------------*/
    /*---------------------------hq--------------------------------*/
    %else %if &DataType = hq %then %do;
    %let FxjDataFile = &FxjPath.DATA\&MarketDir\DAY.DAT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (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; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	proc sql noprint;    create table tmpMaxDate as 
    		select dm ,max(rq) as maxrq from &FinDataDataSet group by dm;
    	quit;
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	%if &FinDataDataSetExist=1 %then %do;
    		if _N_=1 then do;
    			declare hash h(dataset:"work.tmpMaxDate", ordered: 'yes');
    			h.definekey('dm');h.definedata('maxrq');h.definedone();call missing(maxrq);
    		end;
    	%end;
    	format dm $8. rq yymmdd10. maxrq yymmdd10.;
    	infile FxjFile recfm=n end=eof;
    	input @13 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=018x + 1 + (SecID-1)*64;
    		input @(SecPos) dm $6.  @(SecPos+10) RecordCounts ib4. @(SecPos+14) BlockNo ib2.;
    		dm = compress("&CodePrefix"||dm,byte(0)||' ');
    		%if &FinDataDataSetExist=1 %then
    		%do;  rc = h.find(); %end;
    		BlockID = 0;	RecordID=0;
    		do while (BlockID < 25 and BlockNo ne -1);
    			r=0;
    			do while (RecordID<RecordCounts and r<256 and not eof);
    				p=041000x + 1 + 8192*BlockNo + r*32;
    				input @(p+0) rq ib4. @(p+4) kp float4. @(p+8) zg float4. @(p+12) zd float4. 
                          @(p+16) sp float4. @(p+20) sl float4. @(p+24) je float4.;
        			rq = rq/86400 + (MDY(1,1,1970)-MDY(1,1,1960) );
    				if dm in:('SH50','SH51','SZ184','SZ15','SZ16','SH58','SZ03') and rq>mdy(3,3,2003) then
    					roundunit=0.001;  	else roundunit=0.01;
    				kp=round(kp,roundunit);	zg=round(zg,roundunit);
    				zd=round(zd,roundunit);	sp=round(sp,roundunit);
    				sl=round(sl*100,1);			je=round(je,0.01);
    				if rq > maxrq then output;
    				RecordID=RecordID+1;
    				r=r+1;
    			end;
    			BlockID=BlockID+1;
                input @(SecPos+14+BlockID*2) BlockNo ib2.;
    		end; 
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep dm rq kp zg zd sp sl je;
    	stop;
    run;
    %end; 
    /*--------------------------end of hq--------------------------------*/
    /*---------------------------cq--------------------------------*/
    %else %if &DataType = cq %then %do;
    %let FxjDataFile = &FxjPath.DATA\&MarketDir\STKINFO51.DAT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (dm char(8) format=$8. label='代码',
    		rq num   format=YYMMDD10. informat=YYMMDD10. label='日期',fh num  label='分红',sgbl num  label='送股比例',pgbl num  label='配股比例',
    		pgjg num  label='配股价格');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	proc sql noprint;    create table tmpMaxDate as 
    		select dm ,max(rq) as maxrq from &FinDataDataSet group by dm;
    	quit;
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	%if &FinDataDataSetExist=1 %then %do;
    		if _N_=1 then do;
    			declare hash h(dataset:"work.tmpMaxDate", ordered: 'yes');
    			h.definekey('dm');h.definedata('maxrq');h.definedone();call missing(maxrq);
    		end;
    	%end;
    	format dm $8. rq yymmdd10. maxrq yymmdd10.;
    	infile FxjFile recfm=n end=eof;
    	input @9 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=0845898x + 1 + (SecID-1)*248;
    		input @(SecPos) dm $6.;
    		dm = compress("&CodePrefix"||dm,byte(0)||' ');
    		%if &FinDataDataSetExist=1 %then
    		%do;  rc = h.find(); %end;
    		RecordID=0;
    		p=014x+1+ (SecID-1) * 2116 + RecordID * 20;
    		input @p rq ib4.;
    		do while (rq ne 0);
    			input @(p+4) sgbl float4. @(p+8) pgbl float4. @(p+12) pgjg float4. @(p+16) fh float4.;
       			rq = rq/86400 + (MDY(1,1,1970)-MDY(1,1,1960) );
    			sgbl=round(sgbl,0.001);
    			pgbl=round(pgbl,0.001);
    			pgjg=round(pgjg,0.001);
    			fh=round(fh,0.001);
    			if rq > maxrq then output;
    			RecordID=RecordID+1;
    			p=014x+1+ (SecID-1) * 2116 + RecordID * 20;
    	        input @p rq ib4.;
    		end; 
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep  dm rq sgbl pgbl pgjg fh;
    	stop;
    run;
    %end; 
    /*--------------------------end of cq--------------------------------*/
    /*---------------------------gb--------------------------------*/
    %else %if &DataType = gb %then %do;
    %let FxjDataFile = &FxjPath.DATA\CAPITAL.FDT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (dm char(8) format=$8. label='代码',
    		rq num  format=YYMMDD10. informat=YYMMDD10.  label='日期',zgb num  label='总股本',
    		ltg num  label='流通A股',hg num  label='H股',bg num  label='B股');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	proc sql noprint;    create table tmpMaxDate as 
    		select dm ,max(rq) as maxrq from &FinDataDataSet group by dm;
    	quit;
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	%if &FinDataDataSetExist=1 %then %do;
    		if _N_=1 then do;
    			declare hash hh(dataset:"work.tmpMaxDate", ordered: 'yes');
    			hh.definekey('dm');hh.definedata('maxrq');hh.definedone();call missing(maxrq);
    		end;
    	%end;
    	format dm $8. rq yymmdd10. maxrq yymmdd10.;
    	infile FxjFile recfm=n end=eof;
    	input @13 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=018x + 1 + (SecID-1)*64;
    		input @(SecPos) dm $8.  @(SecPos+10) RecordCounts ib4. @(SecPos+14) BlockNo ib2.;
    		dm = compress(dm,byte(0)||' ');
    		if ( dm in:("&CodePrefix") ) then do;
    		%if &FinDataDataSetExist=1 %then
    		%do;  rc = hh.find(); %end;
    		BlockID = 0;	RecordID=0;
    		do while (BlockID < 25 and BlockNo ne -1);
    			r=0;
    			do while (RecordID<RecordCounts and r<16 and not eof);
    				p=041000x + 1 + 3488*BlockNo + r*218;
    				input @(p+214) rq ib4. @(p+12) zgb rb8. @(p+60) ltg rb8. @(p+92) hg rb8. @(p+100) bg rb8.;
        			if rq=0 then rq=.; else rq = rq/86400 + (MDY(1,1,1970)-MDY(1,1,1960) );
    				if (rq > maxrq and not (dm in:('SH1A','SH1B','SH1C'))) then output;
    				RecordID=RecordID+1;
    				r=r+1;
    			end;
    			BlockID=BlockID+1;
                input @(SecPos+14+BlockID*2) BlockNo ib2.;
    		end;
    		end;/* if ( dm in:("&CodePrefix") ) then do;*/
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep dm rq zgb ltg hg bg;
    	stop;
    run;
    %end; 
    /*--------------------------end of gb--------------------------------*/
    /*---------------------------cw--------------------------------*/
    %else %if &DataType = cw %then %do;
    %let FxjDataFile = &FxjPath.DATA\FINANCE.FDT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (dm char(8) format=$8. label='代码',
    		rq num  format=YYMMDD10. informat=YYMMDD10.  label='日期',bsdqtzje num  label='短期投资净额',
    		bsyszkje num  label='应收帐款净额',bschje num  label='存货净额',bsldzc num  label='流动资产',
    		bscqtzje num  label='长期投资净额',bsgdzc num  label='固定资产',bswxzc num  label='无形及其他资产',
    		bszzc num  label='总资产',bsdqjk num  label='短期借款',bsyfzk num  label='应付帐款',
    		bsldfz num  label='流动负债',bscqfz num  label='长期负债',bsfz num  label='负债合计',
    		bsgb num  label='股本',bsssgdqy num  label='少数股东权益',bsgdqy num  label='股东权益',
    		bszbgj num  label='资本公积',bsyygj num  label='盈余公积',iszysr num  label='主营业务收入净额',
    		iszycb num  label='主营业务成本',iszylr num  label='主营业务利润',isqtlr num  label='其它业务利润',
    		isyyfy num  label='营业费用',isglfy num  label='管理费用',iscwfy num  label='财务费用',
    		istzsy num  label='投资收益',islrze num  label='利润总额',issds num  label='所得税',
    		isjlr num  label='净利润',iskchjlr num  label='扣除经常性损益后的净利润',
    		iswfplr num  label='未分配利润',cfjyhdxjlr num  label='经营活动现金流入',
    		cfjyhdxjlc num  label='经营活动现金流出',cfjyhdxjje num  label='经营活动现金净额',
    		cftzxjlr num  label='投资现金流入',cftzxjlc num  label='投资现金流出',
    		cftzxjje num  label='投资现金净额',cfczxjlr num  label='筹措现金流入',
    		cfczxjlc num  label='筹措现金流出',cfczxjje num  label='筹措现金净额',
    		cfxjjze num  label='现金及现金等价物净增额',cfxsspxj num  label='销售商品收到的现金',
    		mgsy num  label='每股收益',mgjzc num  label='每股净资产',tzmgjzc num  label='调整后每股净资产',
    		mgzbgjj num  label='每股资本公积金',mgwfplr num  label='每股未分配利润',mgjyxjllje num  
    		label='每股经营活动产生的现金流量净额',mgxjzjje num  label='每股现金及现金等价物增加净额',
    		mll num  label='毛利率',zyywlrl num  label='主营业务利润率',jll num  label='净利率',zzcbcl num  
    		label='总资产报酬率',jzcsyl num  label='净资产收益率',xsxjzb num  
    		label='销售商品收到的现金占主营收入比例',yszczzl num  label='应收帐款周转率',chzzl num  
    		label='存货周转率',gdzczzl num  label='固定资产周转率',zyywzzl num  label='主营业务增长率',
    		jlrzzl num  label='净利润增长率',zzczzl num  label='总资产增长率',jzczzl num  label='净资产增长率',
    		ldbl num  label='流动比率',sdbl num  label='速动比率',zcfzbl num  label='资产负债比率',fzbl num 
    		label='负债比率',gdqybl num  label='股东权益比率',gdzcbl num  label='固定资产比率',kchmgjlr num 
    		label='扣除经常性损益后每股净利润');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	proc sql noprint;    create table tmpMaxDate as 
    		select dm ,max(rq) as maxrq from &FinDataDataSet group by dm;
    	quit;
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	%if &FinDataDataSetExist=1 %then %do;
    		if _N_=1 then do;
    			declare hash h(dataset:"work.tmpMaxDate", ordered: 'yes');
    			h.definekey('dm');h.definedata('maxrq');h.definedone();call missing(maxrq);
    		end;
    	%end;
    	format dm $8. rq yymmdd10. maxrq yymmdd10.;
    	infile FxjFile recfm=n end=eof;
    	input @13 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=018x + 1 + (SecID-1)*64;
    		input @(SecPos) dm $8.  @(SecPos+10) RecordCounts ib4. @(SecPos+14) BlockNo ib2.;
    		dm = compress(dm,byte(0)||' ');
    		if ( dm in:("&CodePrefix") ) then do;
    		%if &FinDataDataSetExist=1 %then
    		%do;  rc = h.find(); %end;
    		BlockID = 0;	RecordID=0;
    		do while (BlockID < 25 and BlockNo ne -1);
    			r=0;
    			do while (RecordID<RecordCounts and r<32 and not eof);
    				p=041000x + 1 + 14848*BlockNo + r*464;
    				input @(p+460) rq ib4. @(p+12) bsdqtzje rb8. @(p+20) bsyszkje rb8. @(p+28) bschje rb8. 
    				@(p+36) bsldzc rb8. @(p+44) bscqtzje rb8. @(p+52) bsgdzc rb8. @(p+60) bswxzc rb8. 
    				@(p+68) bszzc rb8. @(p+76) bsdqjk rb8. @(p+84) bsyfzk rb8. @(p+92) bsldfz rb8. 
    				@(p+100) bscqfz rb8. @(p+108) bsfz rb8. @(p+116) bsgb rb8. @(p+124) bsssgdqy rb8. 
    				@(p+132) bsgdqy rb8. @(p+140) bszbgj rb8. @(p+148) bsyygj rb8. @(p+156) iszysr rb8. 
    				@(p+164) iszycb rb8. @(p+172) iszylr rb8. @(p+180) isqtlr rb8. @(p+188) isyyfy rb8. 
    				@(p+196) isglfy rb8. @(p+204) iscwfy rb8. @(p+212) istzsy rb8. @(p+220) islrze rb8. 
    				@(p+228) issds rb8. @(p+236) isjlr rb8. @(p+244) iskchjlr rb8. @(p+252) iswfplr rb8. 
    				@(p+260) cfjyhdxjlr rb8. @(p+268) cfjyhdxjlc rb8. @(p+276) cfjyhdxjje rb8. 
    				@(p+284) cftzxjlr rb8. @(p+292) cftzxjlc rb8. @(p+300) cftzxjje rb8. @(p+308) cfczxjlr rb8.
    				@(p+316) cfczxjlc rb8. @(p+324) cfczxjje rb8. @(p+332) cfxjjze rb8. @(p+340) cfxsspxj rb8. 
    				@(p+348) mgsy float4. @(p+352) mgjzc float4. @(p+356) tzmgjzc float4. @(p+360) mgzbgjj float4. 
    				@(p+364) mgwfplr float4. @(p+368) mgjyxjllje float4. @(p+372) mgxjzjje float4. 
    				@(p+376) mll float4. @(p+380) zyywlrl float4. @(p+384) jll float4. @(p+388) zzcbcl float4. 
    				@(p+392) jzcsyl float4. @(p+396) xsxjzb float4. @(p+400) yszczzl float4. @(p+404) chzzl float4. 
    				@(p+408) gdzczzl float4. @(p+412) zyywzzl float4. @(p+416) jlrzzl float4. 
    				@(p+420) zzczzl float4. @(p+424) jzczzl float4. @(p+428) ldbl float4. @(p+432) sdbl float4. 
    				@(p+436) zcfzbl float4. @(p+440) fzbl float4. @(p+444) gdqybl float4. @(p+448) gdzcbl float4. 
    				@(p+452) kchmgjlr float4.;
        			if rq=0 then rq=.; else rq = rq/86400 + (MDY(1,1,1970)-MDY(1,1,1960) );
    				mgsy=round(mgsy,0.001);
    				mgjzc=round(mgjzc,0.001);
    				tzmgjzc=round(tzmgjzc,0.001);
    				mgzbgjj =round(mgzbgjj ,0.001);
    				mgwfplr=round(mgwfplr,0.001);
    				mgjyxjllje =round(mgjyxjllje ,0.001);
    				mgxjzjje =round(mgxjzjje ,0.001);
    				mll =round(mll ,0.001);
    				zyywlrl =round(zyywlrl ,0.001);
    				jll =round(jll ,0.001);
    				zzcbcl =round(zzcbcl ,0.001);
    				jzcsyl =round(jzcsyl ,0.001);
    				xsxjzb =round(xsxjzb ,0.001);
    				yszczzl =round(yszczzl ,0.001);
    				chzzl =round(chzzl ,0.001);
    				gdzczzl =round(gdzczzl ,0.001);
    				zyywzzl =round(zyywzzl ,0.001);
    				jlrzzl =round(jlrzzl ,0.001);
    				zzczzl =round(zzczzl ,0.001);
    				jzczzl =round(jzczzl ,0.001);
    				ldbl =round(ldbl ,0.001);
    				sdbl =round(sdbl ,0.001);
    				zcfzbl=round(zcfzbl,0.001);
    				fzbl =round(fzbl ,0.001);
    				gdqybl=round(gdqybl,0.001);
    				gdzcbl =round(gdzcbl ,0.001);
    				kchmgjlr=round(kchmgjlr,0.001);
    				if (rq > maxrq and not (dm in:('SH1A','SH1B','SH1C')))  then output;
    				RecordID=RecordID+1;
    				r=r+1;
    			end;
    			BlockID=BlockID+1;
                input @(SecPos+14+BlockID*2) BlockNo ib2.;
    		end;
    		end;/* if ( dm in:("&CodePrefix") ) then do;*/
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep dm rq bsdqtzje bsyszkje bschje bsldzc bscqtzje bsgdzc bswxzc bszzc bsdqjk bsyfzk bsldfz 
    		bscqfz bsfz bsgb bsssgdqy bsgdqy bszbgj bsyygj iszysr iszycb iszylr isqtlr isyyfy isglfy 
    		iscwfy istzsy islrze issds isjlr iskchjlr iswfplr cfjyhdxjlr cfjyhdxjlc cfjyhdxjje cftzxjlr 
    		cftzxjlc cftzxjje cfczxjlr cfczxjlc cfczxjje cfxjjze cfxsspxj mgsy mgjzc tzmgjzc mgzbgjj 
    		mgwfplr mgjyxjllje mgxjzjje mll zyywlrl jll zzcbcl jzcsyl xsxjzb yszczzl chzzl gdzczzl 
    		zyywzzl jlrzzl zzczzl jzczzl ldbl sdbl zcfzbl fzbl gdqybl gdzcbl kchmgjlr;
    	stop;
    run;
    %end; 
    /*--------------------------end of cw--------------------------------*/
    /*---------------------------jjjz--------------------------------*/
    %else %if &DataType = jjjz %then %do;
    %let FxjDataFile = &FxjPath.DATA\FUNDWEEK.FDT;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    		create table &FinDataDataSet (dm char(8) format=$8. label='代码',
    		rq num  format=YYMMDD10. informat=YYMMDD10.  label='日期',jz num  label='单位净值');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	proc sql noprint;    create table tmpMaxDate as 
    		select dm ,max(rq) as maxrq from &FinDataDataSet group by dm;
    	quit;
    %end;
    filename FxjFile "&FxjDataFile";
    data ResultTable;
    	%if &FinDataDataSetExist=1 %then %do;
    		if _N_=1 then do;
    			declare hash h(dataset:"work.tmpMaxDate", ordered: 'yes');
    			h.definekey('dm');h.definedata('maxrq');h.definedone();call missing(maxrq);
    		end;
    	%end;
    	format dm $8. rq yymmdd10. maxrq yymmdd10.;
    	infile FxjFile recfm=n end=eof;
    	input @13 SecCounts ib4.;
    	do SecID=1 to SecCounts;
    		SecPos=018x + 1 + (SecID-1)*64;
    		input @(SecPos) dm $8.  @(SecPos+10) RecordCounts ib4. @(SecPos+14) BlockNo ib2.;
    		dm = compress(dm,byte(0)||' ');
    		if ( dm in:("&CodePrefix") ) then do;
    		%if &FinDataDataSetExist=1 %then
    		%do;  rc = h.find(); %end;
    		BlockID = 0;	RecordID=0;
    		do while (BlockID < 25 and BlockNo ne -1);
    			r=0;
    			do while (RecordID<RecordCounts and r<64 and not eof);
    				p=041000x + 1 + 12032*BlockNo + r*188;
    				input @(p+184) rq ib4. @(p+152) jz float4. @(p+176);
        			if rq=0 then rq=.; else rq = rq/86400 + (MDY(1,1,1970)-MDY(1,1,1960) );
        			jz=round(jz,0.0001);
    				if (rq > maxrq and not (dm in:('SH1A','SH1B','SH1C'))) then output;
    				RecordID=RecordID+1;
    				r=r+1;
    			end;
    			BlockID=BlockID+1;
                input @(SecPos+14+BlockID*2) BlockNo ib2.;
    		end;
    		end;/* if ( dm in:("&CodePrefix") ) then do;*/
    	end;/* end of: do SecID=1 to SecCounts;*/
    	keep dm rq jz;
    	stop;
    run;
    %end; 
    /*--------------------------end of jjjz--------------------------------*/
    /*---------------------------bk--------------------------------*/
    %else %if &DataType = bk %then %do;
    %let FxjDataFile = &FxjPath.USERDATA\BLOCK\BLOCK.DEF;
    %CheckIfFxjFileInUse;
    %if %sysfunc(exist(&FinDataDataSet))=0 %then  %do; /*目标数据集不存在*/
    	%let FinDataDataSetExist=0; 
    	proc sql;
    	create table &FinDataDataSet (lb char(20) label='类别',
    	bk char(20) label='板块',dm char(8) format=$8. label='代码',zz char(20)  label='创建者');
    	quit;
    %end; 
    %else %do;
    	%let FinDataDataSetExist=1;
    	data &FinDataDataSet;
    		set &FinDataDataSet;
    		if zz='FXJ' then delete;
    	run;
    %end;
    %let blockDefFile = &FxjDataFile;
    filename blkFilRf "&blockDefFile";
    data blocklist;
    	length x $20. lb $20. bk $20.;
    	retain lb;
    	infile blkFilRf;
    	input  x $;
    	x=compress(x,byte(0)||' ');
    	if substr(x,1,1)='[' then do;
    		lb=compress(x,'[]');
    	end;
    	else do;
    		bk=x;
    	end;
    	if bk ne '';
    	keep lb bk;
    run;
    %let dsid=%sysfunc(open(blocklist));
    %if (&dsid=0) %then %do;%put MSG=%sysfunc(sysmsg());%abort abend;%end;
    %do %while (%sysfunc(fetch(&dsid))=0);
    	%let bk =%sysfunc(trim(  %sysfunc(getvarC(&dsid,%sysfunc(varnum(&dsid,bk))))  ));
    	%let lb =%sysfunc(trim(  %sysfunc(getvarC(&dsid,%sysfunc(varnum(&dsid,lb))))  ));
    	%let FxjDataFile = &FxjPath.USERDATA\BLOCK\&bk..BLK;
    	%CheckIfFxjFileInUse;
    	filename FxjFile "&FxjDataFile";
    	data ResultTableBK;
    		format dm $8. bk $20. lb $20. zz $20.;
    		infile FxjFile recfm=n end=eof;
    		SecID = 1;
    		SecPos=4 + 1 + (SecID-1)*12;
    		input @SecPos dm $8.;
    		do while (dm ne '' and not eof);
    			dm = compress(dm,byte(0)||' ');
    			bk="&bk";
    			lb="&lb";
    			zz='FXJ';
    			if dm ne '' then output;
    			SecID=SecID+1;
    			SecPos=4 + 1 + (SecID-1)*12;
    			input @SecPos dm $8.;
    		end;
    		keep dm bk lb zz;
    		stop;
    	run;
    	proc append base = ResultTable data=ResultTableBK force;
    	run;
    %end;/*do while*/
    %let rc=%sysfunc(close(&dsid));
    proc sql noprint;drop table ResultTableBK;drop table blocklist;quit; 
    %end; 
    /*--------------------------end of bk--------------------------------*/
    
    %else %do;/*参数DataType无效*/
    	%put 参数 &DataType 无效;
    	%abort;
    %end;
    /*-------------------------------------------------------------------*/
    proc append base=&FinDataDataSet data=ResultTable force;/*******force?*******/
    run;
    proc sql noprint;drop table ResultTable;quit; 
    %put %sysfunc(time(),time.)       ==> &FinDataDataSet;
    %mend Fxj2FinData;
    %macro CheckIfFxjFileInUse;
    %if %sysfunc(fileexist(&FxjDataFile))=0 %then
    	%do; %put 文件 &FxjDataFile 不存在!;%return;%abort ABEND; %end;
    %let rc=%sysfunc(filename(FileRef,&FxjDataFile));
    %let fid=%sysfunc(fopen(&FileRef));
    %if &fid=0 %then %do;
    	%put .            &FxjDataFile.已被分析家占用,正在备份该文件并从备份文件读取数据(不要关闭复制窗口)...;
    	filename fxjpipe pipe "copy  /y  &FxjDataFile. &FxjTempFile.";
    	data _null_;
    	infile fxjpipe;
    	input copymsg $;
    	put '             ' copymsg;
    	*rc=system("copy  /y  &FxjDataFile. &FxjTempFile.");
    	call symput('FxjDataFile',"&FxjTempFile");
    	run;
    	filename fxjpipe;
    %end;
    %else %do;%let rc=%sysfunc(fclose(&fid));%end;
    %let rc=%sysfunc(filename(FileRef)); 
    %mend CheckIfFxjFileInUse;
    /*************************************************************************************
    使用说明:
    1)调用格式:Fxj2FinData(Market,DataType,FinDataLib)
    其中,
    Market:市场代码,SH为沪市,SZ为深市,BK为板块指数,如果有其它市场数据,可有其它市场代码如HK等.
    DataType:数据类型,dm,cq,hq,等等,含义见下面注释
    FinDataLib:目标逻辑库,如果给定的目标逻辑库不存在,则将设为Work
    2)如果数据文件已经被分析家等软件占用导致无法打开时,将自动复制一份该文件,并从该备份文件中读取数据.
    3)程序将自动补充数据,即如果目标表不存在,则建立并添加数据,如果目标表已存在,则判断表中每只证券的最新
    数据,然后只添加数据表中所缺少的数据.
    ***************************************************************************************/
    /*请修改以下的参数*/
    %let FxjPath=C:\fxj\;/*分析家安装目录*/
    
    /*请确认要转换的数据,在下面语句的%后加*变为注释取消转换*/
    %Fxj2FinData(sh,dm,findata);   /*dm--证券代码 => cndm */
    %Fxj2FinData(sz,dm,findata);                   /*同上*/
    %*Fxj2FinData(sh,hq,findata);   /*hq--每日行情 => cnhq */
    %*Fxj2FinData(sz,hq,findata);
    %*Fxj2FinData(sh,cq,findata);  /*cq--除权数据 => cncq */
    %*Fxj2FinData(sz,cq,findata); 
    %*Fxj2FinData(sh,gb,findata);  /*gb--股本结构(专业财务数据)=>cngb */
    %*Fxj2FinData(sz,gb,findata);
    %*Fxj2FinData(sh,cw,findata);  /*cw--财务数据(专业财务数据) =>cncw */
    %*Fxj2FinData(sz,cw,findata);	
    %*Fxj2FinData(sh,jjjz,findata);  /*jjjz--基金净值(专业财务数据)=> cnjjjz */
    %*Fxj2FinData(sz,jjjz,findata);
    %*Fxj2FinData(cn,bk,findata);/*板块*/
    
    /*香港市场*/	
    %*Fxj2FinData(hk,dm,FinData);  
    %*Fxj2FinData(hk,hq,FinData);
    
    
    options source number date notes;
    
    
     
  2. 谢谢版主。
     
  3. zwz

    zwz

    提取大智慧新一代V2分笔成交数据(L1,不支持读取Level2的逐笔成交数据)的SAS程序:
    Code:
    
    options nosource nonumber nodate nonotes nomprint nomlogic noxwait error=10;
    %macro DzhFBSJ(filename,code,dsname);
    	%put %sysfunc(putn(%sysfunc(time()),time.)) 开始读取,请稍候...;
    	%let code=%upcase(&code);	
    	%local market;
    	%if &code ne SH and  &code ne SZ and &code ne HK %then %do;
    		%let market=%sysfunc(substr(&code,1,2));
    		%let findcode=1;
    	%end;
    	%else %do;
    		%let market=&code;
    		%let findcode=0;
    	%end;
    
    	/*判断文件是否被占用开始*/
    	%let PrpTempFile = %sysget(temp)\dzhFileBySas.tmp;
    	%if %sysfunc(fileexist(&filename))=0 %then
    		%do; %put 文件 &filename 不存在!;%return;%abort ABEND; %end;
    	%let rc=%sysfunc(filename(FileRef,&filename));
    	%let fid=%sysfunc(fopen(&FileRef));
    	%if &fid=0 %then %do;
    		%put .            &filename.已被大智慧2占用,正在备份该文件并从备份文件读取数据(不要关闭复制窗口)...;
    		filename prppipe pipe "copy  /y  &filename.  &PrpTempFile.";
    		data _null_;
    		infile prppipe;
    		input copymsg $;
    		put '             ' copymsg;
    		call symput('filename',"&PrpTempFile");
    		run;
    		filename prppipe;
    	%end;
    	%else %do;%let rc=%sysfunc(fclose(&fid));%end;
    	%let rc=%sysfunc(filename(FileRef)); 
    	/*判断文件是否被占用结束*/
    	/*开始读取数据...*/
    	filename DzhFile "&filename";
    	data &dsname;
    		attrib dm format=$8. label='代码'  rq format=datetime. label='时间' zjcj label='最近成交价' zss label='总手数'
    		je label='金额' xss label='现手数' mm format=$2. label='内外盘' mr1jg label='买一价' 
    		mr1sl label='买一量' mr2jg label='买二价' mr2sl label='买二量' mr3jg label='买三价' mr3sl label='买三量'
     		mr4jg label='买四价' mr4sl label='买四量'  mr5jg label='买五价' mr5sl label='买五量'
    		mc1jg label='卖一价' mc1sl label='卖一量' mc2jg label='卖二价' mc2sl label='卖二量' 
    		mc3jg label='卖三价' mc3sl label='卖三量' mc4jg label='卖四价' mc4sl label='卖四量'
    		mc5jg label='卖五价' mc5sl label='卖五量';
    		retain zssSaved;
    		infile DzhFile recfm=n end=eof;
    		input @13 SecCounts ib4.;
    		do SecID=1 to SecCounts;
    			SecPos=018x + 1 + (SecID-1)*64;
    			input @(SecPos) dm $6.  @(SecPos+10) RecordCounts ib4. @(SecPos+14) BlockNo ib2.;
    			dm = compress("&market"||dm,byte(0)||' ');
    			%if &findcode=1 %then %do;
    			if dm = "&code" then do;
    			%end;%else %do;
    			if dm in:("&market") then do;
    			%end;
    				BlockID = 0;	RecordID=0;  zssSaved=0;
    				do while (BlockID < 25 and BlockNo ne -1);
    					r=0;
    					do while (RecordID<RecordCounts and r<236 and not eof);
    						p=041000x + 1 + (236 * 52)*BlockNo + r*52;
    						input @p rq ib4. @(p+4) zjcj float4. @(p+8) zss float4. @(p+12) je float4. @(p+21) mmp ib1. 
    							@(p+42) mr1jg ib1. @(p+22) mr1sl pib2. 
    							@(p+43) mr2jg ib1. @(p+24) mr2sl pib2. 
    							@(p+44) mr3jg ib1. @(p+26) mr3sl pib2. 
    							@(p+45) mr4jg ib1. @(p+28) mr4sl pib2.
    							@(p+46) mr5jg ib1. @(p+30) mr5sl pib2.
    							@(p+47) mc1jg ib1. @(p+32) mc1sl pib2. 
    							@(p+48) mc2jg ib1. @(p+34) mc2sl pib2. 
    							@(p+49) mc3jg ib1. @(p+36) mc3sl pib2.
    							@(p+50) mc4jg ib1. @(p+38) mc4sl pib2.
    							@(p+51) mc5jg ib1. @(p+40) mc5sl pib2.     ;
    		    			rq = rq + (DHMS(MDY(1,1,1970),0,0,0)-DHMS(MDY(1,1,1960),0,0,0) );
    						if dm in:('SH50','SH51','SZ184','SZ15','SZ16','SH58','SZ03') then do;
    								roundunit=0.001;jgdiv=1000;
    							end;
    						else do;
    								roundunit=0.01;jgdiv=100;
    							end;
    						zjcj=round(zjcj,roundunit);	zss=round(zss,roundunit);je=round(je,roundunit);
    						mr1jg=round(zjcj+mr1jg/jgdiv,roundunit);
    						mr2jg=round(zjcj+mr2jg/jgdiv,roundunit);
    						mr3jg=round(zjcj+mr3jg/jgdiv,roundunit);
    						mr4jg=round(zjcj+mr4jg/jgdiv,roundunit);
    						mr5jg=round(zjcj+mr5jg/jgdiv,roundunit);
    						mc1jg=round(zjcj+mc1jg/jgdiv,roundunit);
    						mc2jg=round(zjcj+mc2jg/jgdiv,roundunit);
    						mc3jg=round(zjcj+mc3jg/jgdiv,roundunit);
    						mc4jg=round(zjcj+mc4jg/jgdiv,roundunit);
    						mc5jg=round(zjcj+mc5jg/jgdiv,roundunit);
    						if mmp=-128 then mm='内'; else mm='外';
    						xss =zss - zssSaved;
    						zssSaved = zss;
    						output;
    						RecordID=RecordID+1;
    						r=r+1;
    					end;
    					BlockID=BlockID+1;
    	            	input @(SecPos+14+BlockID*2) BlockNo ib2.;
    				end; 
    			end;
    		end;
    		keep  dm rq zjcj zss je xss mm mr1jg mr1sl mr2jg mr2sl mr3jg mr3sl mr4jg mr4sl mr5jg mr5sl mc1jg mc1sl mc2jg mc2sl mc3jg mc3sl mc4jg mc4sl mc5jg mc5sl;
    		stop;
    	run;
    	filename dzhfile;
    	%put %sysfunc(putn(%sysfunc(time()),time.)) 读取结束,结果保存在&dsname!;
    %mend;
    /* 大智慧新一代行情软件分笔数据读取程序V1.0
    DzhFBSJ参数说明:
    第1个:分笔数据文件完整名称,如d:\dzh\data\sh\report.dat或d:\dzh\data\sh\20070126.PRP等
    第2个:可以是SH,SZ或类拟于SH000001,SZ000001的证券代码.
          如果是SH或SZ读出沪市或深市所有代码的分笔数据,否则只读出该代码的分笔数据
    第3个:分笔数据要保存到哪个数据集,如work.shhqmb等.
    调用例子:
    %DzhFBSJ(d:\dzh\data\sh\report.dat,sh600000,shhqmb);
    %DzhFBSJ(d:\dzh\data\sh\20070126.prp,sh,shhqmb);
    %DzhFBSJ(d:\dzh\data\sz\20070126.prp,sz000001,szhqmb);
    %DzhFBSJ(d:\dzh\data\sh\report.dat,sh600036,shhqmb);
    .....
    如果同时有多个调用,第3个参数不得相同,而且不要与现有数据表同名哦,否则...!!.
    by [url]www.sasfans.com[/url]
    */
    %DzhFBSJ(d:\dzh\data\sz\20070126.prp,sz000001,work.szhqmb);
    
    options source number date notes;
    
     
  4. zwz,
    可否抽空做个大智慧新一代免费传统行情(最新版本2007-1-8)的各种数据导出为文本格式的工具软件?
    文本格式可供SAS、WLD、AB、TS、TR、TB、QD、Excel等等各家同时使用。

    http://level2.gw.com.cn
     
  5. zwz

    zwz

  6. 可否做一个读飞狐版本的扩展数据库文件的SAS程序
    飞狐的行情 指标计算+SAS的分析 挖掘
    那会是怎样的一个证券分析引擎