Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei zeilenweise Einlesen mit TFileStream (https://www.delphipraxis.net/156007-datei-zeilenweise-einlesen-mit-tfilestream.html)

petergensfeld 16. Nov 2010 14:38

Delphi-Version: 2010

Datei zeilenweise Einlesen mit TFileStream
 
Hallo zusammen,

ich würde gerne eine umfangreichere Datei mit Messdaten im Textformat zeilenweise einlesen. Aufgrund des Umfangs möchte ich es nicht so gerne mit TStringList.LoadFromFile machen, weil dann alles auf einmal im Hauptspeicher landet.

Das zeilenweise Einlesen mit den veralteten Routinen AssignFile/Reset/ReadLn/CloseFile geht schon, aber ich würde es lieber mit Streams machen. Dazu habe ich die TStream-Klasse um eine ReadLn-Funktion ergänzt. So hab ich's versucht:

Delphi-Quellcode:
type
  TStreamHelper = class helper for TStream
  public
    function ReadString: string;
  end;

function TStreamHelper.ReadLine: string;
var
  S: String;
  Ch: Char;
begin
  S := '';
  while Read(Ch, 1) = 1 do
  begin
    S := S + Ch;
    if RightStr(S, Length(sLineBreak)) = sLineBreak then
    begin
      S := LeftStr(S, Length(S) - Length(sLineBreak));
      Break;
    end;
  end;
  Result := S;
end;
Funktioniert auch, ist aber leider quälend langsam. Was kann ich tun, um die Laufzeit zu optimieren? Oder gibt es einen anderen Ansatz ohne die veralteten Routinen zu verwenden?

Dirk

Hawkeye219 16. Nov 2010 14:55

AW: Datei zeilenweise Einlesen mit TFileStream
 
Hallo Dirk,

hast du den Delphi-Referenz durchsuchenTStreamReader aus der Unit Classes schon einmal getestet?

Gruß Hawkeye

himitsu 16. Nov 2010 14:55

AW: Datei zeilenweise Einlesen mit TFileStream
 
Die alten Pascal-Routinen kann man immernoch nutzen.
> Delphi-Referenz durchsuchenAssignFile, Delphi-Referenz durchsuchenReset, Delphi-Referenz durchsuchenReadLn und Co.
- diese arbeiten sequentiell und laden nicht alles in den RAM
- sie funktionieren aber direkt nur mit ANSI-Text

ansonsten
eventuell das genannte TStreamReader
http://www.delphipraxis.net/88342-te...tml#post600578
http://www.delphipraxis.net/151481-t...-einlesen.html
...

petergensfeld 16. Nov 2010 15:25

AW: Datei zeilenweise Einlesen mit TFileStream
 
Dankeschön! Das ist genau das, was ich gesucht habe. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz