1

是否可以逐行搜索 TextFile 以查找特定字符串。IE。Hello 它逐行搜索以查找是否有任何行包含 Hello。每行只有一个字符串。这可能吗?如果是这样,我该如何尝试?

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;

我假设当你说

如果任何行中有 Hello

您正在寻找包含搜索字符串的行而不是等于搜索字符串的行。


在评论中你问:

好的,然后我可以问是否可以询问如何从文件中删除从编辑框中键入的字符串?因此,您在编辑框中输入一个字符串,然后它会在文件中搜索它并删除该行?

这是上面的一个简单的变体:

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 循环。

循环变量正在下降以允许循环修改列表。

如果你想使用不同的测试,比如相等而不是包含,那么只需修改 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 回答