📄 readdatafileut.pas
字号:
unit ReadDataFileUt;
interface
uses Windows, Classes, Controls, SysUtils;
type
TDataRec=class
code:string;
rq:TDate;
kp:single;
sp:single;
zg:single;
zd:single;
sl:single;
je:single;
sgbl:single;
pgbl:single;
pgjg:single;
fh:single;
IndicateGroups:TStrings;
end;
TPSFHRec=class
code:string;
rq:TDate;
sgbl:single;
pgbl:single;
pgjg:single;
fh:single;
end;
TCWInfoRec=class
dm:string;//,代码,code,10,0,0,;" +
rq:TDate;//,报告期,date,4,0,4,; +
gxrq:TDate;//更新日期,date,4,0,0,; +
ssrq:TDate;//上市日期,date,4,0,8,; +
col1:single;//每股收益,single,4,0,12,; +
col2:single;//每股净资产,single,4,0,16,; +
col3:single;//净资产收益率,single,4,0,20,; +
col4:single;//每股经营现金,single,4,0,24,; +
col5:single;//每股公积金,single,4,0,28,; +
col6:single;//每股未分配,single,4,0,32,; +
col7:single;//股东权益比,single,4,0,36,; +
col8:single;//净利润同比,single,4,0,40,; +
col9:single;//主营收入同比,single,4,0,44,; +
col10:single;//销售毛利率,single,4,0,48,; +
col11:single;//调整每股净资产,single,4,0,52,; +
col12:single;//总资产,single,4,0,56,; +
col13:single;//流动资产,single,4,0,60,; +
col14:single;//固定资产,single,4,0,64,; +
col15:single;//无形资产,single,4,0,68,; +
col16:single;//流动负债,single,4,0,72,; +
col17:single;//长期负债,single,4,0,76,; +
col18:single;//总负债,single,4,0,80,; +
col19:single;//股东权益,single,4,0,84,; +
col20:single;//资本公积金,single,4,0,88,; +
col21:single;//经营现金流量,single,4,0,92,; +
col22:single;//投资现金流量,single,4,0,96,; +
col23:single;//筹资现金流量,single,4,0,100,; +
col24:single;//现金增加额,single,4,0,104,; +
col25:single;//主营收入,single,4,0,108,; +
col26:single;//主营利润,single,4,0,112,; +
col27:single;//营业利润,single,4,0,116,; +
col28:single;//投资收益,single,4,0,120,; +
col29:single;//营业外收支,single,4,0,124,; +
col30:single;//利润总额,single,4,0,128,; +
col31:single;//净利润,single,4,0,132,; +
col32:single;//未分配利润,single,4,0,136,; +
col33:single;//总股本,single,4,0,140,; +
col34:single;//无限售股合计,single,4,0,144,; +
col35:single;//A股,single,4,0,148,; +
col36:single;//B股,single,4,0,152,; +
col37:single;//境外上市股,single,4,0,156,; +
col38:single;//其他流通股,single,4,0,160,; +
col39:single;//限售股合计,single,4,0,164,; +
col40:single;//国家持股,single,4,0,168,; +
col41:single;//国有法人股,single,4,0,172,; +
col42:single;//境内法人股,single,4,0,176,; +
col43:single;//境内自然人股,single,4,0,180,; +
col44:single;//其他发起人股,single,4,0,184,; +
col45:single;//募集法人股,single,4,0,188,; +
col46:single;//境外法人股,single,4,0,192,; +
col47:single;//境外自然人股,single,4,0,196,; +
col48:single;//优先股或其他,single,4,0,200, ;
end;
TDataLine=class
DayFileName:string;
InfoFileName:string;
StockName:string;
code:string;
count:integer;
DataRecs:TStrings;
PSFHRecs:TStrings;
CWInfoRecs:TStrings;
constructor create;
procedure ReadDataRecs;
end;
TAllDataLine=class
FileName:string;
count:integer;
DataLines:TStrings;
procedure ReadAllDataRecs;
end;
TIndicate=class
name:string;
params:array of integer;
value:single;
// procedure Calc; virtual;
end;
TIndicateGroup=class
name:string;
indicates:TStrings;
end;
implementation
uses functionUt;
constructor TDataLine.create;
begin
inherited;
DataRecs:=TStringList.Create;
end;
procedure TDataLine.ReadDataRecs;
var
iFileHandle :int64;
iFileLength: int64;
iBytesRead: Integer;
Buffer: pointer;
FStream:TMemoryStream;
fileoffset:int64;
AllCount:integer;
StockSeq,BlockSeq,RecSeq,BlockPos:integer;
finded:boolean;
DataRec:TDataRec;
BlockNo:word;
begin
iFileHandle := FileOpen(DayFileName, fmOpenRead);
if iFileHandle=-1 then
begin
// showmessage('文件打开失败');
exit;
end;
try
fileoffset:=0;
iFileLength := LongFileSeek(iFileHandle,fileoffset,2);
fileclose(iFileHandle);
FStream:=TMemoryStream.Create;
FStream.SetSize(iFileLength);
FStream.LoadFromFile(DayFileName);
AllCount:=ReadStreamInt(FStream,20,0);
StockSeq:=0;
while (StockSeq<= AllCount-1)or finded do
begin
if Code=ReadStreamChar(FStream,24+StockSeq*64,10,0) then
begin
self.count:=ReadStreamWord(FStream,24+StockSeq*64+10,0);
BlockSeq:=0;
RecSeq:=0;
while BlockSeq<25 do
begin
BlockNo:=ReadStreamWord(FStream,24+StockSeq*64+14+(BlockSeq-1)*2,0);
if BlockNo=65535 then
break;
BlockPos:=0;
// while (RecSeq<=self.count) and (BlockPos<256) do
while (RecSeq<=100) and (BlockPos<256) do
begin
DataRec:=TDataRec.Create;
DataRec.code:=code;
DataRec.rq:=strtodate('1970-1-1')+ReadStreamInt(FStream,266240+BlockNo*8192+BlockPos*32,0)/86400;
DataRec.kp:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+4,0);
DataRec.zg:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+8,0);
DataRec.zd:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+12,0);
DataRec.sp:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+16,0);
DataRec.sl:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+20,0);
DataRec.je:=ReadStreamSingle(FStream,266240+BlockNo*8192+BlockPos*32+24,0);
self.DataRecs.AddObject(code+'-'+datetostr(DataRec.rq),DataRec);
RecSeq:=RecSeq+1;
BlockPos:=BlockPos+1;
end;
BlockSeq:=BlockSeq+1;
end;
break;
end;
StockSeq:=StockSeq+1;
end;
finally
FStream.Free;
end;
end;
procedure TAllDataLine.ReadAllDataRecs;
var
iFileHandle :int64;
iFileLength: int64;
iBytesRead: Integer;
Buffer: pointer;
FStream:TMemoryStream;
fileoffset:int64;
AllCount,i:integer;
StockSeq:integer;
DataLine:TDataLine;
begin
iFileHandle := FileOpen(FileName, fmOpenRead);
try
fileoffset:=0;
iFileLength := LongFileSeek(iFileHandle,fileoffset,2);
LongFileSeek(iFileHandle,0,0);
FStream:=TMemoryStream.Create;
FStream.SetSize(iFileLength);
FStream.LoadFromFile(FileName);
AllCount:=ReadStreamInt(FStream,24,0);
StockSeq:=0;
while (StockSeq<= AllCount-1) do
begin
DataLine:=TDataLine.Create;
DataLine.DayFileName:=self.FileName;
DataLine.code:=ReadStreamChar(FStream,24+StockSeq*64,10,0);
self.DataLines.AddObject(DataLine.code,DataLine);
StockSeq:=StockSeq+1;
end;
finally
fileclose(iFileHandle);
FStream.Free;
end;
for i:=0 to self.DataLines.Count-1 do
TDataLine(self.DataLines[i]).ReadDataRecs;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -