Delphi读取下一行并替换

Delphi读取下一行并替换,delphi,replace,seek,Delphi,Replace,Seek,我有一个程序可以导入一个包含多个入口的文本文件: ### Starttime: 06.03.2008 Data: SOME RECORDS HERE ### Starttime: 21.03.2008 Data SOME RECORDS HERE 。。。 等等 不是,我想在“数据”之后有一个结束时间:这是下一个开始时间-1,所以我有 ### Starttime: 06.03.2008 Data: SOME RECORDS HERE EndTime: 20.03.2008 ### Start

我有一个程序可以导入一个包含多个入口的文本文件:

###
Starttime: 06.03.2008
Data: SOME RECORDS HERE

###
Starttime: 21.03.2008
Data SOME RECORDS HERE
。。。 等等

不是,我想在“数据”之后有一个结束时间:这是下一个开始时间-1,所以我有

###
Starttime: 06.03.2008
Data: SOME RECORDS HERE
EndTime: 20.03.2008

###
Starttime: 21.03.2008
Data SOME RECORDS HERE
EndTime: (next starttime -1)
。。。
依此类推,你必须一行一行地复制文件,并在适当的时候插入新行。您不能在文本文件中移动内容。

那么,您必须逐行复制文件,并在适当的时候插入新行。您不能在文本文件中移动内容。

最简单的方法是将文件读入
TStringList
并在那里工作

伪代码:

var 
  S: TStringList;
  i: Integer;
  LastDate: TDateTime;
  CurDate: TDateTime;
begin
  S := TStringList.Create;
  S.LoadFromFile('c:\...');

  i := 0;
  while i < S.Count do
  begin
    if S[i] = "###" then
    begin
      CurDate := StrToDate(S[i+1])
      S.Insert(i-3, DateToStr(CurDate));
      LastDate := CurDate;
      i := i+2;
    end else
    begin
      i := i+1;
    end;
  end;
  S.SaveToFile('c:\...');
end;
var
S:TStringList;
i:整数;
LastDate:TDateTime;
CurDate:TDateTime;
开始
S:=TStringList.Create;
S.LoadFromFile('c:\…');
i:=0;
当我数的时候
开始
如果S[i]=“####”那么
开始
CurDate:=strotdate(S[i+1])
S.插入(i-3,DateToStr(CurDate));
LastDate:=当前日期;
i:=i+2;
结束其他
开始
i:=i+1;
结束;
结束;
S.SaveToFile('c:\…');
结束;

这段代码不是很健壮,它不会检查任何特殊情况,比如第一个开始日期,但它应该足以让您开始工作。

最简单的方法是将文件读入
TStringList
并在那里工作

伪代码:

var 
  S: TStringList;
  i: Integer;
  LastDate: TDateTime;
  CurDate: TDateTime;
begin
  S := TStringList.Create;
  S.LoadFromFile('c:\...');

  i := 0;
  while i < S.Count do
  begin
    if S[i] = "###" then
    begin
      CurDate := StrToDate(S[i+1])
      S.Insert(i-3, DateToStr(CurDate));
      LastDate := CurDate;
      i := i+2;
    end else
    begin
      i := i+1;
    end;
  end;
  S.SaveToFile('c:\...');
end;
var
S:TStringList;
i:整数;
LastDate:TDateTime;
CurDate:TDateTime;
开始
S:=TStringList.Create;
S.LoadFromFile('c:\…');
i:=0;
当我数的时候
开始
如果S[i]=“####”那么
开始
CurDate:=strotdate(S[i+1])
S.插入(i-3,DateToStr(CurDate));
LastDate:=当前日期;
i:=i+2;
结束其他
开始
i:=i+1;
结束;
结束;
S.SaveToFile('c:\…');
结束;

这段代码不是很健壮,它不会检查任何特殊情况,例如第一个开始日期,但它应该足以让您开始使用。

这种方法的问题是它需要与新文件匹配的内存量。读取一个文件并写入另一个文件将更加高效,因为您只需访问每行一次,并且只要有磁盘空间,就可以处理任何大小的文件。这种方法的问题是,它需要与新文件匹配的内存量。读取一个文件并写入另一个文件将更加高效,因为您只需访问每一行一次,并且只要有磁盘空间,就能够处理任何大小的文件。+1-这实际上是一种比将所有内容加载到tStringlist中更好的方法。您只需要与保存最长的行读取一样多的内存,并且不必访问每行多次。(tStringlist在内部写入时必须再次访问每一行)+1-这实际上是一种比将所有内容加载到tStringlist中更好的方法。您只需要与保存最长的行读取一样多的内存,并且不必访问每行多次。(tStringlist在内部写入时必须再次访问每一行)