1

特定の文字列を見つけるために、TextFile を 1 行ずつ検索することは可能ですか。すなわち。Hello 行ごとに検索して、行に Hello が含まれているかどうかを調べます。1 行に 1 つの文字列しかありません。これは可能ですか?もしそうなら、どうやってこれを試みますか?

4

2 に答える 2

7

ファイル全体をメモリにロードするのが確かに最も簡単です。ファイルが十分に小さい場合は、次のように実行できます。

found := false;
sl := TStringList.Create;
try
  sl.LoadFromFile(fileName);
  for line in sl do
    if Pos('Hello', line)<>0 then
    begin
      found := true;
      break;
    end;
finally
  sl.Free;
end;

私はあなたが言うとき

いずれかの行にHe​​lloが含まれている場合

検索文字列と等しい行ではなく、検索文字列を含む行を探していること。


コメントであなたは尋ねます:

では、編集ボックスから入力した文字列をファイルから削除する方法を尋ねることができるかどうかを尋ねることはできますか?それで、編集ボックスに文字列を入力すると、ファイルでその文字列が検索され、その行が削除されますか?

これは、上記の簡単なバリエーションです。

procedure RemoveLinesContaining(const fileName, searchText: string);
var
  sl: TStringList;
  i: Integer;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(fileName);
    for i := sl.Count-1 downto 0 do
      if Pos(searchText, sl[i])<>0 then
        sl.Delete(i);
    sl.SaveToFile(fileName);
  finally
    sl.Free;
  end;
end;

この関数は、検索文字列を含むすべての行を削除します。そのような最初の行だけを削除したい場合は、Deleteを呼び出した後にforループから抜け出します。

ループ変数は、ループがリストを変更できるように降順です。

別のテストを使用する場合は、containsではなくequalityと言ってから、ifステートメントを変更するだけです。

于 2012-08-24T06:38:55.943 に答える
1

簡単な方法は、 を使用TStringList.LoadFromFileしてファイルをロードし、チェックIndexOf('hello')することです。値が より大きい場合-1、文字列はファイル内にあります。

var
  sl : TStringList;
  ix : Integer;
begin
  sl := TStringList.Create;
  try      
    sl.LoadFromFile('test.txt'); 
    ix := sl.IndexOf('Hello');
    if ix > -1 then ShowMessage('Yup, the file contains a greeting.');
  finally 
    sl.Free;
  end;
end;
于 2012-08-24T05:05:14.360 に答える