【问题标题】:Delphi read next line and replaceDelphi 读取下一行并替换
【发布时间】:2009-07-30 11:50:16
【问题描述】:

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

###
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)

... 等等

【问题讨论】:

    标签: delphi replace seek


    【解决方案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;
    

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

    【讨论】:

    • 这种方法的问题是它需要内存量来匹配新文件的内存量。读取一个文件并写入另一个文件会更有效率,因为您只需访问每一行一次,并且只要有磁盘空间就可以处理任何大小的文件。
    【解决方案2】:

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

    【讨论】:

    • +1 - 这实际上是比将所有内容加载到 tStringlist 更好的方法。您只需要尽可能多的内存来保存最长的行读取,并且不必多次访问每一行。 (tStringlist 在内部写入时必须再次访问每一行)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    相关资源
    最近更新 更多