高分求一段DELPHI代码

xyzivan 2015-07-17 07:33:58
有一无类型文件,但可以用TXT 打开,文件大小约为30M,且内容一直会增加。

txt文件内容如下
...
ABCDE 123
BCDEF 234
ABCDE 888888
CDEFG 234
....
ABCDE 999999
主要操作过程如下
当读取到'ABC'时,将空格后面的所有字符都复制到memo里面去,如果没有就进行下一行判断(程序运行正常时应该将123,888888能复制出来)

1、因为文件太大每次读取时都很慢,我想将文件当前的最后一行复制出来并保存后,下一次运行程序时直接将指针定位到保存的最后一行。

2、将最后一行(ABCDE 999999)以前的数据全部剪切到D:\123.TXT文件中去,这样应该也可以提升速度


...全文
371 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
flowerslike 2015-07-28
  • 打赏
  • 举报
回复
这个应该不难吧
xyzivan 2015-07-20
  • 打赏
  • 举报
回复
我去百度了一下,得到以下代码: procedure TForm1.Button1Click(Sender: TObject); var f:TextFile; s:string; begin OpenDialog1.Filter:='文本文件(*.txt)|*.txt'; //过滤文件 Memo1.Lines.Clear;//清空memo if OpenDialog1.Execute then begin AssignFile(f,OpenDialog1.FileName);//打开一个文本文件。 Reset(f);//只读方式打开 while not Eof(f) do//文件没读完 begin Readln(f,s);//读取一行 if Pos('ip',s)>0 then Memo1.Lines.Add(s);//条件判断。这里用pos判断包含字符 ip end; CloseFile(f); end; end; procedure TForm1.Button2Click(Sender: TObject); begin //把Memo里面的东西保存到一个新的文本文件中去 Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'1.txt'); end; {因为文本文件里面直接删除行不好操作,采取了一个变通的方法。先读取文本文件,进行判断,如果符合条件就保存到Memo里面去。最后把Memo里面的东西保存到一个指定的文件文件里面去。或者覆盖原来的文件。 } 这个应该是可以的,但我想直接删除处理过的行的话是不是直接 在if Pos('ip',s)>0 then Memo1.Lines.Add(s);//条件判断。这里用pos判断包含字符 ip 用delete(s)就行了? 公司的电脑上没有d7,没办法试,能不能在这段代码上加以修改
wlei0295 2015-07-20
  • 打赏
  • 举报
回复
高人很多,能力很强,鉴定完毕。
xyzivan 2015-07-19
  • 打赏
  • 举报
回复
感觉我这个小菜鸟把大神们绕进去了,经过思考,我要的其实可以简化成下面这种. 读一行文本并判断条件:------ 如果满足----复制指定的内容到memo1(这里可以把已经判断过的行删除掉,这样文件内容就小了)---并跳到下一行判断------如果不满足----删除本行...然后一直这样到文件尾并保存就行了,这样这个文件里面就只会有最后一条数据了.要的数据到了memo里面去了,不需要的就删除.这样文件内容就小了. 我只是有思路,不会用代码把我想要的完成所以请大家帮帮忙写出来,并在关键的地方能给出解释这样我可以学习下
xyzivan 2015-07-19
  • 打赏
  • 举报
回复
@lyhoo163 代码不是我写的,会写那个代码我就厉害了.其实就是个文本文件,改了下扩展名而已.
lyhoo163 2015-07-19
  • 打赏
  • 举报
回复
建议生成的文件1名,带上时间标记,定时生成一个文件。这样,定时搜索数据方便。
lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
问一下,生成无类型文件,代码是你写的吗?
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
2、将最后一行(ABCDE 999999)以前的数据全部剪切到D:\123.TXT文件中去,这样应该也可以提升速度 请问这个怎么表达 应该是pos加哪个函数?可以将pos到的字符与此文件的第一行复制下来的。 我去找了下百度,上面只有pos copy 没有说怎么可以复制到第一行去的
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
@缘中人 不是的实时写的。
缘中人 2015-07-18
  • 打赏
  • 举报
回复
文件是否实时写入,如果实时写入,切割不现实,一边切,一边写有数据丢失和冲突
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
2、将最后一行(ABCDE 999999)以前的数据全部剪切到D:\123.TXT文件中去,这样应该也可以提升速度 这段代码应该怎么表达呢?
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
@lyhoo163 哈哈,又看到你了,这个文件是无类型的,但可以用txt打可,也可以操作的吗?
lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
使用TStrigList速度更快。
procedure TForm1.Button1Click(Sender: TObject);
var MyList1,MyList2:TStringList;
  i, j ,k: Integer;
  S1,S2: string;

begin
  MyList1:=TStringList.Create;
  MyList2:=TStringList.Create;
  MyList1.LoadFromFile('D:\1.txt');
  MyList2.Clear;
  for i := 0 to MyList1.Count-1 do
  begin
    S1:= := MyList1.Strings[i];
    j:=Pos('ABC', S1);
    if J> 0 then
    begin
      K:=Pos(' ', S1);
      S2:=Copy(S1,K+1,Length(S1)-k);
      MyList2.Add(S2);
    end;
  end;
  MyList2.SaveToFile('D:\123.txt');
end;
lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
不应该是无类型文件,应该是文本文件。 关键文本文件不能无限增长,对已处理的部分应该删除,或按时间段生成。 处理上1楼方式可取。
lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
获取空格位置 获取子字符串
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
spos := Pos(' ', lineText); lineText:= lineText.Substring(spos, lineText.Length); 请问这两句代表什么意思?
xyzivan 2015-07-18
  • 打赏
  • 举报
回复
大哥,我比较菜,能不能给段完整的代码,并且做一下解释?
缘中人 2015-07-18
  • 打赏
  • 举报
回复
不是实时写,那么处理完,savetofile成功后,删除原文件。 或者改个名字就不用新保存文件了,
  • 打赏
  • 举报
回复
另外,用二进制方式打开文件,自己扫描每行,也可以快很多,可以把上次处理的位置记下来,下次直接seek到此位置。
  • 打赏
  • 举报
回复
每次处理完之后把该文件改个名,比如xxxx.backup001/002...之类的,然后新建一个空的该文件。下次依此类推。
加载更多回复(1)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧