Delphi 在文本文件中搜索具有特定字符串的行

Delphi 在文本文件中搜索具有特定字符串的行,delphi,Delphi,是否可以逐行搜索文本文件以查找特定字符串。 你好 它逐行搜索,以查找其中是否有行包含Hello。每行只有一个字符串。 这可能吗? 如果是这样的话,我该如何尝试呢?一个简单的方法是使用TStringList.LoadFromFile加载文件,然后选中IndexOf'hello'-如果大于-1,则字符串在文件中 var sl : TStringList; ix : Integer; begin sl := TStringList.Create; try sl.Lo

是否可以逐行搜索文本文件以查找特定字符串。 你好 它逐行搜索,以查找其中是否有行包含Hello。每行只有一个字符串。 这可能吗? 如果是这样的话,我该如何尝试呢?

一个简单的方法是使用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;
一种简单的方法是使用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;

将整个文件加载到内存中当然是最简单的。如果您的文件足够小,则可以这样做:

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;
我想当你说

如果有人打招呼的话

您正在查找包含搜索字符串的行,而不是与搜索字符串相等的行

你在评论中问:


好的,那么我可以问一下,是否可以问一下如何 是否从文件中删除编辑框中键入的字符串?所以 在编辑框中输入字符串,然后它搜索文件 并删除该行

这是上述内容的一个简单变化:

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

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


如果您想使用不同的测试,可以说是equality而不是contains,然后只需修改If语句。

将整个文件加载到内存中肯定是最简单的。如果您的文件足够小,则可以这样做:

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;
我想当你说

如果有人打招呼的话

您正在查找包含搜索字符串的行,而不是与搜索字符串相等的行

你在评论中问:


好的,那么我可以问一下,是否可以问一下如何 是否从文件中删除编辑框中键入的字符串?所以 在编辑框中输入字符串,然后它搜索文件 并删除该行

这是上述内容的一个简单变化:

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

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


如果要使用不同的测试,请说equality而不是contains,然后只需修改If语句。

是否准备将整个文件加载到内存中,还是需要将其加载到较小的块中?是否准备将整个文件加载到内存中,或者您需要将其装入较小的块中吗?好的,然后我可以问您是否可以询问如何从文件中删除编辑框中键入的字符串。因此,您在编辑框中输入一个字符串,然后它在文件中搜索该字符串并删除该行?如果文件太大,则内存不足:@MattBiggs您应该首先回答David对您的问题的评论。@Matt如果您愿意,可以问这个问题。但不是在评论中。这是一个新问题。或者对这个文件进行编辑。@Jeroen和David您认为不适合存储的文本文件的百分比是多少?我认为我们可以假设这不是一个问题,除非OP在问题中另有说明。这种讨论对我来说没有用。通过如此大的文本文件进行线性搜索无论如何都会非常慢。这种方法假设整行都是Hello。问题是问一行是否包含Hello。好的,然后我可以问一下如何从文件中删除编辑框中键入的字符串。因此,您在编辑框中输入一个字符串,然后它在文件中搜索该字符串并删除该行?如果文件太大,则内存不足:@MattBiggs您应该首先回答David对您的问题的评论。@Matt如果您愿意,可以问这个问题。但不是在评论中。这是一个新问题。或者对这个文件进行编辑。@Jeroen和David您认为不适合存储的文本文件的百分比是多少?我认为我们可以假设这不是一个问题,除非OP在问题中另有说明。这种讨论对我来说没有用。通过如此大的文本文件进行线性搜索无论如何都会非常慢。这种方法假设整行都是Hello。问题是问一行是否包含Hello.+1表示可能正确但我在阅读问题时遗漏的假设。+1表示可能正确但我在阅读问题时遗漏的假设。