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()
中的这些代码行(其中 i
是 raw_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”
因此包含 '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()
中的这些代码行(其中 i
是 raw_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”