5

私は最新バージョンの Lazarus IDE を使用してMemo1おり、TForm1 に があります。テキスト ファイルを読み込んでMemo1から、メモのすべての行を編集する必要があります (私は を使用しますMemo1.Lines.Strings[i] := ...)。最後に、編集したメモを特定のパスに保存する必要があります。

質問: 私は次の間のより速い方法を探しています:

  1. メモ内のテキスト全体を読み込み、その内容を編集して新しいファイルに保存します (すべて読み込み -> すべて編集 -> すべて書き込み)。
  2. ファイルを1行ずつ読み取り、コンテンツを編集して新しいファイルに保存するwhileループを(ファイルの最後まで)実行します。*.txt(行の読み込み -> 編集 -> 書き込み | 読み込み -> 編集 -> 書き込み | 行の読み込み -> 編集 -> 書き込み | ...)

私は Delphi の開発にかなり慣れていないので、 に関するページもいくつか読みましTStringListsた。私のテキスト ファイルには多くの行があり (5000 行以上になることもあります)、プログラムのパフォーマンスが低下することは望ましくありません。

なにか提案を?TStringListまたは、前にリストした 2 つの方法のいずれかを使用する必要がありますか?

4

1 に答える 1

9

5000文字列が非常に長い場合を除き、行はそれほど多くありません。

最も簡単な方法は、を使用することTStringListです。ユーザーがコンテンツを表示または編集する必要がない限り、GUI コントロールを使用する必要はありません。

var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(YourFileNameHere);
    for i := 0 to SL.Count - 1 do
    begin
      SL[i] := IntToStr(i) + ' ' + SL[i];
      // Do any other processing
    end;

    SL.SaveToFile(YourFileNameHere);
  finally
    SL.Free;
  end;
end;

(上記のコメントで述べたように)TMemoテスト目的でこれを行う必要がある場合は、同じ方法で行うことができます。

Memo1.Lines.LoadFromFile(YourFileNameHere);
for i := 0 to Memo1.Lines.Count - 1 do
  Memo1.Lines[i] := IntToStr(i) + ' ' + Memo1.Lines[i];
Memo1.Lines.SaveToFile(YourFileNameHere);

もちろん、これを行う最も簡単な方法はTStrings、あらゆる種類の単純な子孫を受け入れるプロシージャを作成することです。

procedure AppendValueToStrings(const SL: TStrings; 
  StartingValue: Integer);
var
  i: Integer;
begin
  Assert(Assigned(SL));  // Make sure a valid TStrings has been passed in
  for i := 0 to SL.Count - 1 do
  begin
    SL[i] := IntToStr(StartingValue) + ' ' + SL[i];
    Inc(StartingValue);
  end;
end; 

次に、次のいずれかで呼び出すことができます。

SL := TStringList.Create;
try
  SL.LoadFromFile(YourFileNameHere);
  AppendValueToStrings(SL, 10);
  SL.SaveToFile(YourFileNameHere);
finally
  SL.Free;
end;

Memo1.Lines.LoadFromFile(YourFileNameHere);
AppendValueToStrings(Memo1.Lines, 10);
Memo1.Lines.SaveToFile(YourFileNameHere);
于 2014-01-01T22:07:58.450 に答える