如何将文本文件分割成若干文本文件?(100分)

  • 主题发起人 主题发起人 joann
  • 开始时间 开始时间
J

joann

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将文本文件分割成若干文本文件,每个文本文件为30条记录,并保存为file1,file2...fileN?
文件格式如下:

管辖机构: 4012345 报表编号 :C0000001
扣款通知书
机构: 4000000xx支行 $w 页号: 1
------------------------------------------------------------------------------

xx支行 $w
日期: 2002-01-01

邮编 : 123456
地址 : 九龙路63弄10号101室
姓名 : 郑一


xx银行消费信贷扣款通知书
扣款日期: 2002-01-01

尊敬的 郑一 先生/女士 :
我行已从您的帐户中支取以下金额作为本次供款额, 特此通知。
------------------------------------------------------------------------------
贷款帐号 : 400000000000000001 客户编号 : 00000001
楼盘名称 : xxxx建设发展有限公司 楼盘编号 : 000001
存款帐号 : 4000000000001234567  总期数 : 180
现用利率 : 0.00465000 罚息利率 : 0.00630000

期号 本金 利息 罚息 起息日期
------------------------------------------------------------------------------
20 4,670.04 5,185.98 0.00 2002-01-11

本次扣款金额为 : 9,856.02
阁下现时在我行的贷款余额为 : 1,110,594.20
------------------------------------------------------------------------------
说明:如有不符,请于扣款后20天内到经办 银行查询 ,过期则视阁下已认可。
...........
...........
...........
...........
...........
...........

管辖机构: 4012345 报表编号 :C0000001
扣款通知书
机构: 4000000xx支行 $w 页号: 2
------------------------------------------------------------------------------

xx支行 $w
日期: 2002-01-01

邮编 : 123456
地址 : 八龙路263弄1号1101室
姓名 : 郑一


xx银行消费信贷扣款通知书
扣款日期: 2002-01-01

尊敬的 王小一 先生/女士 :
我行已从您的帐户中支取以下金额作为本次供款额, 特此通知。
------------------------------------------------------------------------------
贷款帐号 : 400000000000000002 客户编号 : 00000007
楼盘名称 : xxxx建设发展有限公司 楼盘编号 : 000002
存款帐号 : 4000000000002222227  总期数 : 180
现用利率 : 0.00465000 罚息利率 : 0.00630000

期号 本金 利息 罚息 起息日期
------------------------------------------------------------------------------
3 407.72 1,420.40 1.00 2002-01-01

本次扣款金额为 : 1,828.12
阁下现时在我行的贷款余额为 : 337,781.94
------------------------------------------------------------------------------
说明:如有不符,请于扣款后20天内到经办 银行查询 ,过期则视阁下已认可。

 
这个很简单,你创建一个Tstrings
var
i, x : integer;
list1 : Tstrings;
templist : Tstrings;
tempfilename : string;
begin
list1 := Tstringlist.create;
templist := Tstringlist.create;
list1.loadfromfile('filename');
x :=0;
for i:= 1 to list1.count do
begin
templist.add(list1[i-1]);
if (i mod 30)=0 then
begin
inc(x);
tempfilename :='file'+ inttostr(x);
templist.savetofile(tempfilename);
templist.clear;
end;
end;
end;
 
如果一条记录的标志确定,则在原来上面程序中
if (i mod 30)=0 then 的条件替换成你每两记录之间的判断就可以了
思路一样,比方说空行代表记录之间的标示,则
var
i,j , x : integer;
list1 : Tstrings;
templist : Tstrings;
tempfilename : string;
begin
list1 := Tstringlist.create;
templist := Tstringlist.create;
list1.loadfromfile('filename');
x :=0;
j := 1;
for i:= 1 to list1.count do
begin
templist.add(list1[i-1]);
if length(trim(list1[i-1]))=0 then
inc(j); //如果出现空行,记录数增加1
if (j mod 30)=0 then //j记载当前正在处理记录的条数
begin
inc(x); //增加文件名序列号
tempfilename :='file'+ inttostr(x);//合成新文件名
templist.savetofile(tempfilename);//保存临时list
templist.clear;//清除临时list
end;
end;
end;
 
运行通过,但新文件没有产生,是否因为原格式有空行(有一行,也有二行)
 
如果这个文件是有规律的很好办,假如刚好是30行读出来。。

你可以就用文件的读写 Writeln 和Readln实现。。。
 
运行通过,但存在两个问题:
1.产生的file1,file2...fileN不是txt文件.
2.最后不足30条的记录被舍弃了,没有保存到fileN
 
你这个文件很有规律:可以用''管辖机构''做为每条记录的开始标志
'说明:'做为每条记录的结束标志,循环30次以后再创建一个文件继续循环,
如果到了所有记录结束时做一下判断就行了;
具体函数,
读行readln()
写行writeln()
关连文件assignfile()
打开文件reset()
创建并打开文件rewrite()
具体用法可以查一下help.
 
楼上各位兄弟,这种做法好像行不通呀,有没有写好的源码发一份儿给小弟?hbxyk@ufsoft.com.cn谢谢
 
接受答案了.
 
后退
顶部