Delphi: скопировать определенные строки из списка строк в другой

Я получаю сообщение об ошибке «Предел индекса вне облигаций», когда пытаюсь скопировать определенные строки по индексу из одного TStringList в другой.

У меня есть текстовый файл, содержащий строки, отформатированные с помощью вертикальной черты "|" разделитель. Это выглядит так:

файл test.txt

В моем целевом файле я хочу скопировать только некоторые элементы из строк, начинающихся с '3M', чтобы получить что-то вроде этого (первая строка, например):

3M 2189300002 12.99

3M is Stringlist.strings[1]

2189300002 is Stringlist.strings[3]

12.99 is 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;

Что не так с моим кодом?


person MKaiser    schedule 03.10.2017    source источник


Ответы (1)


В вашем коде довольно много ошибок.

Ваш цикл 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;
person Remy Lebeau    schedule 03.10.2017
comment
Этот вопрос был для меня воспоминанием, ваш ответ намного полнее моего. - person Carlos Rafael Ramirez; 04.10.2017