Delphi 循环遍历 TextFile 以获取特定字符串,将该字符串复制到变量

Delphi Looping through TextFile for specific string the copying that string to a variable

因此包含 'NVMEM' 的行已成功从文本文件中删除。我实际上希望发生相反的情况,它将删除除包含字符串 'NVMEM' 的行之外的每一行。我尝试将按钮 2 的 for 循环下的 if 语句更改为认为可行的 if not 语句,但它只会删除所有内容。有没有办法让我能够删除除包含字符串的行之外的所有行。

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
NVE: TextFile;

begin
if not FileExists('NVE.txt') then
  begin
  AssignFile(NVE, 'NVE.txt');
  Rewrite(NVE);

  WriteLn(NVE, 'abcdefg') ;
  WriteLn(NVE, 'hijklmnop')      ;
  WriteLn(NVE, 'fmdiomfsa');
  WriteLn(NVE, 'heres the line with NVMEM'); //line I want to parse


  ShowMessage('You have successfully created the file amigo');
  CloseFile(NVE);

  end;


if FileExists('NVE.txt') then
  begin
    AssignFile(NVE,'NVE.txt');
    Rewrite(NVE);

    WriteLn(NVE, 'abcdefg') ;
    WriteLn(NVE, 'hijklmnop');
    WriteLn(NVE, 'hope i got that right');
    WriteLn(NVE, 'heres the line with NVMEM'); //line I want to parse

      ShowMessage('Eso Final');
      CloseFile(NVE);

  end;
end;

procedure TForm3.Button2Click(Sender: TObject);
var
NVE: string;
i : integer;
raw_data1,stringy: string;
raw_data: TstringList;
begin
  stringy := 'NVMEM';
  i := 0;
  raw_data := TStringlist.Create;
  try
    raw_data.LoadFromFile('NVE.txt');
    for i := raw_data.Count-1 downto 0 do
      if pos(stringy, raw_data[i])<>0 then
        raw_data.Delete(i);
    raw_data.SaveToFile('NVE.txt');
  finally
    raw_data.free;
  end;
end;



end.

首先回忆一下function Pos(SubStr, Str: string): integer的作用。

`Pos()` returns the position of `SubStr` within `Str` if `SubStr` is included in `Str`.
`Pos()` returns 0 when `SubStr` is not included in `Str`. 

现在,对于 Button2Click() 中的这些代码行(其中 iraw_data 中一行的索引),您要修改以删除除该行之外的所有行包含“NVMEM”:

  if pos(stringy, raw_data[i]) <> 0 then  // your current code
    raw_data.Delete(i);

可以拼写为“如果 stringy 包含在 raw_data[i] 中,则删除 raw_data[i]”,这与您想要的相反。

反过来逻辑,即“如果stringy 包含在raw_data[i]中,则删除raw_data[i] ", 操作如下:

Pos() returns 0 当SubStr不包含在Str中,所以删除一行的条件应该是:

  if pos(stringy, raw_data[i]) = 0 then   // change `<>` to `=`
    raw_data.Delete(i);

这将使您在 raw_data: TStringList 中留下一行,该行包含“NVMEM”