关于编程实现文本文件各对应域转为SQL SERVER数据库表的问题,在线多谢!(150分)

  • 主题发起人 dolphinpro
  • 开始时间
D

dolphinpro

Unregistered / Unconfirmed
GUEST, unregistred user!
现要实现一数据采集模块,将大机中采集的数据,保存到数据库中。共有文本文件两个(实例结构见下),用|隔开各域,每段域内容需转为SQL SERVER 数据表中各字段内容,我现定义了两个RECORD(结构见下),作为容器,又定义了两个函数(实现作用如下)。
请教众大侠,该如何一边读文本文件,一边将其转为SQL SERVER数据库表呢?十分感谢。


文件一
60070|20020624
60070051001005783|1600003008||中国工业上海公司|123008000|60070000001005783|0| 0|4.6500| 0| 0| 0|20000125|20020714|20020714|310351| 0| 600
60070051002000718|1600001470||上海资产经营有限公司|123008000|60070000002000718|0| 0|4.6500| 0| 0| 0|20001102|20020714|20020714|310370| 0| 0
60070051004003900|1600002573||上海海洋有限公司|123006000|60070000004003900|0| 0|4.6500| 0| 0| 0|20001225|20020714|20020714|310377| 0| 0
60070051006015266|1600001217||上海市股份有限公司|123008000|60070000006015266|0| 0|4.6500| 0| 0| 0|20000531|20020714|20020714|310375| 0| 0
60070051144033088|1600002400||上海资产经营有限公司|123008000|60070000144033088|0| 1300000000|4.9500| 24862500| 0| 0|20000929|20020714|20020714|310376| 18200000000| 0
60070051144033088|1600012377||上海资产经营有限公司|123008000|60070000144033088|0| 1600000000|4.8750| 0| 0| 0|20011008|20020714|20020714|310376| 22400000000| 0
60070051190028311|1600011517||上海(集团)有限公司|123001000|60070000190028311|0| 10000000000|4.6500| 0| 0| 0|20011231|20020714|20020714|310375| 40000000000


文件二
60070|20020624
60070000001000164|132278215 |上海(集团)有限公司|201001000| 1000000000|0.8250|0.0000|0.0000|310380| 0| 0| 6370923168| 0|0
60070000001002145|132211897 |上海出口公司|201009000| 0|0.8250|0.0000|0.0000|310344| 0| 0| 0| 0|0
60070000001002228|631146196 |上海管理咨询有限公司|201009000| 6705|0.8250|0.0000|0.0000|310370| 0| 0| 563220| 0|0
60070000001002301|132223687 |上海置业公司|201009000| 1258187657|0.8250|0.0000|0.0000|310377| 0| 0| 105324624753| 0|0
60070000001002483|002427016 |上海市财政性资金专户|201020000| 3218241700|0.8250|0.0000|0.0000|310370| 0| 0| 297321454875| 0

type
RFileHead = ^TFileHead;
TFileHead = Record
Brno: string[6];
Date: string[8];
Actno:string[17];
Entpsno:string[11];
Name:string[40];
Actflg:string[1];
Upacno:string[9];
Avbal:Array[1..14] of Real;
Intcode:string[3];
Uprate:Array[1..6] of Real;
Downrate:Array[1..6] of Real;
Lntlrno:string[6];
Dbacm:Array[1..17] of Real;
Cramr:Array[1..17] of Real;
Dbadiacm:Array[1..17] of Real;
Cradiacm:Array[1..17] of Real;
end;

RFileHead2nd = ^TFileHead2nd;
TFileHead2nd = Record
Brno: string[6];
Date: string[8];
Contid:string[10];
Entps:string[11];
Name:string[40];
Actflg:string[1];
Upacno:string[9];
Savactno:string[17];
LoanType:string[1];
Owedamt:Array[1..14] of Real;
Intrate:Array[1..6] of Real;
Owedint:Array[1..14] of Real;
Inpnshint:Array[1..14] of Real;
Sday:string[8];
Eday:string[8];
Exday:string[8];
Lntlrno:string[6];
Memopnshint:string[20];

end;


function GetSubStr(var aString: string; Sepchar: string): string;
//得到字符串中一个子串
//改变aString的值
var
Mystr:String;
StrLen:Integer;
SepCharPos:Integer;
begin
StrLen:=Length(aString);
SepCharPos:=Pos(SepChar,aString);//计算分割符在子串中的位置
MyStr:=Copy(aString,1,SepCharPos);//将分隔符前所有字符放到MyStr子串中
Delete(aString,1,SepCharPos);//除去分隔符与分隔符前子串
GetSubStr:=MyStr;//返回一个字段
end;

function GetSubStrNum(aString,SepChar:String):Integer;
//计算一个字符串被分割成几个字段
var
i:Integer;
StrLen:Integer;
Num:Integer;
begin
StrLen:=Length(aString);
Num:=0;
for i:=1 To StrLen do
if Copy(aString,i,1)=SepChar then
Num:=Num+1;
GetSubStrNum:=Num;

end;
 
你这样做不太好。
建一个动态数组,数组的长度为字段数。然后对取回来的字符串作循环读‘|’,
从第一个读,碰到一个就把他的值赋给数组
如:
for i := 0 to length(ssss) do
begin
if sss<>'|' then
begin
temp := temp+sss
continue;
end
else
begin
varray := temp
end;
end;
//大致如此,
保存时再按字段类型进行保存。

 
顶部