Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

Datei mit fester Satzlänge in TStrings laden

  Alt 17. Feb 2006, 13:52
Folgende Procedure lädt eine Datei mit fester Satzlänge in ein TStrings - Objekt.
Falls man die Satzlänge mit 0 angibt, wird davon ausgegangen, dass die Zeilen keine feste Satzlänge
haben, sondern mit CR/LF getrennt sind.
Für optimale Performance sollte man TStringList verwenden. Andere von TStrings abgeleitete Klassen
wie z.B. TMemoStrings sind teilweise bis zu 100-fach langsamer.
Delphi-Quellcode:
procedure LoadFixedRecordStream(list: TStrings; stream: TStream; reclen: Integer);
var
  buffer : string;
begin
  if reclen = 0 then
  begin
    // Datei hat variable Satzlänge
    // jeder Satz ist mit CR-LF abgeschlossen
    list.LoadFromStream(stream);
  end
  else
  begin
    // Datei hat feste Satzlänge
    list.Clear;
    SetLength(buffer, reclen); // Speicher für einen Datensatz besorgen

    list.BeginUpdate;
    try
      // vorab Speicher in Stringliste reservieren
      // dies verbessert die Performance
      list.Capacity := ((stream.Size-stream.Position) div reclen) +1;

      while stream.Position < stream.Size-reclen do
      begin
        // Record einlesen
        stream.ReadBuffer(buffer[1], reclen);
        // und an Stringliste anhängen
        list.Add(buffer);
      end;
    finally
        list.EndUpdate;
    end;
  end;
end;

procedure LoadFixedRecordFile(list: TStrings; const filename: string; reclen: Integer);
var
  stream : TStream;
begin
  stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite);
  try
    LoadFixedRecordStream(list, stream, reclen);
  finally
    stream.Free;
  end;
end;
[edit=Chakotay1308]Aktualisierten Code von shmia eingefügt. Mfg, Chakotay1308[/edit]
Andreas
  Mit Zitat antworten Zitat