Чтение длинных строк (> 256 символов) в Tstringlist при использовании в файле записи - PullRequest
0 голосов
/ 19 апреля 2020

Основываясь на некоторых комментариях, приведенных здесь ( Как работать с записями, используя файловый поток ввода-вывода вместо «старого» ввода-вывода ), я попытался переписать свой код. (Я попросил потоковое решение, но это все еще открытый вопрос). Я использую таблицы, созданные и поддерживаемые в Excel, которые хранятся в виде TXT-файлов с разделителями табуляции (здесь: File1.txt). Теперь я использую компонент stringlist для чтения данных и анализа строки с помощью небольшой программы, найденной в другом месте (адаптированной к моим потребностям). Однако нужная мне строковая запись должна быть длиннее 256 символов, тогда как Delphi требует, чтобы я определил строку как строку [255], иначе я получу ошибку «финализации». Мой вопрос: как получить полную строку в моих записях? Вот код:

TExample = record
    Nr     : integer;   
    Load   : string[16]; 
    Tekst  : string[255]; // this is my problem, I can't use it without the "[255]"
  end;

procedure ParseString(const SourceString : string; Nr: integer) ;
///       based on Zarko Gajic's procedure
///       uses tab char (#9) as delimiter
///       Nr = number of substrings
///       fills global string array SA[0..Nr-1] with the parsed substrings
var
  N,K,i   : integer;
  txt   : string;
begin
  txt := SourceString + #9;
  Setlength(SA, Nr);
  i := 0;
  while Length(txt) > 0 do begin
    K := Pos(#9, txt) ;
    SA[i] := Copy(txt,0,K-1) ;
    trim(SA[i]);                           // get rid of any trailing #13#10 chars
    txt := Copy(txt,K+1,MaxInt) ;
    i := i+1;
  end;
end;

procedure ConvertFile1;
var
  TFile         : textfile;
  EFile         : File of TExample;
  Fname         : string;
  SList         : TStringlist;
  BigStr        : string;                  // this is full line of data to be parsed
  ER            : TExample;
  i,N           : integer;
  AE            : array of TExample;
begin 
  MainDir := GetCurrentDir;  
  Fname := MainDir + '\Data\File1.txt';
  AssignFile(Tfile, Fname);
  if (FileExists(Fname)) then begin
    try
      SList := TStringList.Create;
      SList.Loadfromfile(Fname);
      N := SList.Count;
      SetLength(AE,N-1);
      for i := 1 to N-1 do begin           // i := 1 will skip 1st line = a header in .txt file
        BigStr := SList[i];
        ParseString(BigStr,3);             // real data may have > 3 columns 
        ER.Nr := StrtoInt(SA[0]);     
        ER.Load := SA[1]);
        ER.Tekst := SA[2];
        AE[i-1] := AR;
      end;
    finally
      if Assigned(sList) then FreeAndNil(sList);
    end;
  end;

Спасибо, Фред

...