如何查找文件的任一行数据(100分)

  • 主题发起人 主题发起人 luojun
  • 开始时间 开始时间
L

luojun

Unregistered / Unconfirmed
GUEST, unregistred user!
如何查找文件的任一行数据?
我有一文本文件,该文件数据很大(不可能放入内存),我希望可以输入文件的行数找到该行的数据.查找速度当然越快越好!
如下
a.txt
1234567
54394595
fdslfjklsfjs
kflsdjlf
fdsjfkls
输入3 显示第三行数据 fdslfjklsfjs
谢谢 !
 
自己定义文件的行数,然后想办法让行数标识符不能被修改,再执行查找,如
FindDialog1.FindText(行数标识符...);
 
可以分块读入内存.
只要字符串查找#13#10就可以了.
 
可以用内存映象文件的方法将该文件映象到内存,再查找#13#10,这样可能会
快一些。
 
用 Readln ,第几行就 Readln 几次,就读出来了
 
我的数据有500000条,我可不希望读500000次readln
 
将你的文本文件转化为记录文件吧!
定义记录:
Tmytext=record
myline:string;
end;
Tfile=file of Tmytext;
将文本文件的以为行单位先都灌到记录文件里头。
当你要查找某一行时就在这个记录文件里找。
如你所举的例子:
找第三行:
var
myfile:Tfile;
myrecord:Tmytext;
begin
assignfile(myfile,path);
reset(myfile);
seek(myfile,3-1);
read(myfile,myrecord);//读取myrecord的内容即可
closefile(myfile);
end;


 
定义记录:
Tmytext=RECORD
myline:string[256];
end;
 
该文件数据很大: how much.
if size<n M
you can use CLASS TSTRINGLIST
var DatList:TStrignList;
S:string;
index:integer;
begin
DatList:=TStringList.Create;
DatList.LoadFromFile('aa.txt');
S:=DatList.strings[index];
end;
 
该文件>50M
 
用随机文件读取呀, 开一块内存, 一次读一部分, 然后判断.
才50M? 如果内存开1M, 要取最后一行也只要读50次. 1M内存中查某个字符
(具体说是 #13)的时间很短. 时间主要花在读取上.
 
你得查找,所以不管怎么样,都得读进来,
都很慢,想不出什么好的办法。
 
5000次Readln不会很慢吧?
 
to:
cheka兄:
他说的是50万次 ^!^
 
编一个辅助程序,生成一个行号索引文件,包含每一行的Offset值。
运行时,先读索引文件的Offset,再去那个大文件直接ReadLn。
 
多人接受答案了。
 
后退
顶部