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

时间:2017-10-03 20:59:52

标签: text delphi-xe5 tstringlist

当我尝试按索引将特定字符串从一个TStringList复制到另一个时,我收到了“债券限制超出债券”错误。

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

test.txt file

在我的目标文件中,我只想从以'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;

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

您的代码中存在很多错误。

您的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;