Delphi :将特定行从 Stringlist 复制到另一个
Delphi : Copy specific lines from Stringlist to another
当我尝试按索引将特定字符串从一个 TStringList
复制到另一个时出现 "Index limit out of bonds" 错误。
我有一个文本文件,其中包含用竖线“|”格式化的行定界符。它看起来像这样:
在我的目标文件中,我只想从以 '3M'
开头的行中复制一些项目,以便获得如下内容(例如第一行):
3M 2189300002 12.99
3M
是 Stringlist.strings[1]
2189300002
是 Stringlist.strings[3]
12.99
是 Stringlist.strings[6]
这是我的代码:
var
sl,new : tstringlist;
lscount,index : integer;
begin
sl:= TStringList.Create;
sl.LoadFromFile('C:\Folder\test.txt');
new := tstringlist.create;
lscount := lstringlist.Count;
for index := 0 to lscount do
begin
sl.delimiter := '|';
sl.StrictDelimiter := True;
sl.DelimitedText := sl.Strings[index];
if sl.Strings[1] = '3M' then
new.Add(sl.Strings[1]+sl.Strings[3]+sl.Strings[6]);
end;
new.SaveToFile('C:\Folder\new.txt');
sl.Free;
new.Free
end;
我的代码有什么问题?
你的代码中有不少错误。
您的 for
循环是从索引 0 循环到 lscount
,但 TStringList
的上限是 lscount-1
。
您在循环 sl
时正在修改 sl
。解析每一行时需要使用单独的TStringList
。
您正在使用基于 1 的索引访问已解析的字符串,但 TStringList
使用基于 0 的索引。
试试像这样的东西:
var
sl, parse, new : TStringList;
index : Integer;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\Folder\test.txt');
new := TStringList.create;
try
parse := TStringList.Create;
try
parse.Delimiter := '|';
parse.StrictDelimiter := True;
for index := 0 to sl.Count-1 do
begin
parse.DelimitedText := sl.Strings[index];
if (parse.Count > 5) and (parse.Strings[0] = '3M') then
new.Add(parse.Strings[0] + ' ' + parse.Strings[2] + ' ' + parse.Strings[5]);
end;
finally
parse.Free;
end;
new.SaveToFile('C:\Folder\new.txt');
finally
new.Free;
end;
finally
sl.Free
end;
end;
当我尝试按索引将特定字符串从一个 TStringList
复制到另一个时出现 "Index limit out of bonds" 错误。
我有一个文本文件,其中包含用竖线“|”格式化的行定界符。它看起来像这样:
在我的目标文件中,我只想从以 '3M'
开头的行中复制一些项目,以便获得如下内容(例如第一行):
3M 2189300002 12.99
3M
是 Stringlist.strings[1]
2189300002
是 Stringlist.strings[3]
12.99
是 Stringlist.strings[6]
这是我的代码:
var
sl,new : tstringlist;
lscount,index : integer;
begin
sl:= TStringList.Create;
sl.LoadFromFile('C:\Folder\test.txt');
new := tstringlist.create;
lscount := lstringlist.Count;
for index := 0 to lscount do
begin
sl.delimiter := '|';
sl.StrictDelimiter := True;
sl.DelimitedText := sl.Strings[index];
if sl.Strings[1] = '3M' then
new.Add(sl.Strings[1]+sl.Strings[3]+sl.Strings[6]);
end;
new.SaveToFile('C:\Folder\new.txt');
sl.Free;
new.Free
end;
我的代码有什么问题?
你的代码中有不少错误。
您的 for
循环是从索引 0 循环到 lscount
,但 TStringList
的上限是 lscount-1
。
您在循环 sl
时正在修改 sl
。解析每一行时需要使用单独的TStringList
。
您正在使用基于 1 的索引访问已解析的字符串,但 TStringList
使用基于 0 的索引。
试试像这样的东西:
var
sl, parse, new : TStringList;
index : Integer;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\Folder\test.txt');
new := TStringList.create;
try
parse := TStringList.Create;
try
parse.Delimiter := '|';
parse.StrictDelimiter := True;
for index := 0 to sl.Count-1 do
begin
parse.DelimitedText := sl.Strings[index];
if (parse.Count > 5) and (parse.Strings[0] = '3M') then
new.Add(parse.Strings[0] + ' ' + parse.Strings[2] + ' ' + parse.Strings[5]);
end;
finally
parse.Free;
end;
new.SaveToFile('C:\Folder\new.txt');
finally
new.Free;
end;
finally
sl.Free
end;
end;