Delphi :将特定行从 Stringlist 复制到另一个

Delphi : Copy specific lines from Stringlist to another

当我尝试按索引将特定字符串从一个 TStringList 复制到另一个时出现 "Index limit out of bonds" 错误。

我有一个文本文件,其中包含用竖线“|”格式化的行定界符。它看起来像这样:

在我的目标文件中,我只想从以 '3M' 开头的行中复制一些项目,以便获得如下内容(例如第一行):

3M 2189300002 12.99

3MStringlist.strings[1]

2189300002Stringlist.strings[3]

12.99Stringlist.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;