Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 29.03.07 12:03 
Salve, Leute !

Heute mal ein banales Problem. Ich möchte eine ganz simple ASCII-Datei mit einem TFileStream einlesen (AssignFile/CloseFile soll ja demnächst sterben). Die Datei sieht in etwa so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
32°50.6873,012°14.4250,-38,72,70{CR}{LF}
32°50.6856,012°14.4189,-42,68,70{CR}{LF}
32°50.6861,012°14.4131,-42,68,70{CR}{LF}
32°50.6876,012°14.4077,-42,68,70{CR}{LF}
32°50.6895,012°14.4022,-41,69,70{CR}{LF}
32°50.6940,012°14.3896,-39,71,70{CR}{LF}
32°50.6970,012°14.3825,-39,71,70{CR}{LF}


Das in geschweiften Klammern soll das ASCII-Zeichen $0D bzw. $0A darstellen.

Nun: Diese Datei will ich zeilenweise einlesen und entsprechend verarbeiten. TFileStream hat aber nur ein ReadBuffer... Muß ich jetzt allen ernstes die Datei Byteweise auslesen und bei einer CR/LF-Kombination hab ich die Zeile komplett ? Das kanns doch nicht sein, dauert doch Ewigkeiten...

Einlesen in ein Memofeld oder eine TStringList kommt nicht in Frage, da die Datei problemlos 100MB (und somit viele hunderttausend Zeilen) erreichen kann. Sowas kann man einer StringList aber nicht anbieten, ohne sehr viel Zeit zu haben...

TReader ist auch keine Maßnahme, da diese Klasse nur tagged Strings auslesen kann.

Gibts da irgendwas in der Klassenbibliothek, das ich übersehen habe ?

Olaf

[Edit] Post gehört wohl eher nach "Dateizugriff", oder ? Kann ein Mod vllt. verschieben... Danke[/Edit]

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Do 29.03.07 12:16 
Hi,

nimm doch eine TStringList:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var 
  Zeilen: TStringList;
  i: Integer;
Begin
  Zeilen:= TStringList.Create;
  Zeilen.LoadFromFile('C:\DeineDatei.ASC');

  For i:= 0 To Zeilen.Count - 1 Do WriteLn(Zeilen[i]);
End;
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 29.03.07 12:42 
Wer lesen kann, ist klar im Vorteil:

user profile iconOlafSt hat folgendes geschrieben:

Einlesen in ein Memofeld oder eine TStringList kommt nicht in Frage, da die Datei problemlos 100MB (und somit viele hunderttausend Zeilen) erreichen kann. Sowas kann man einer StringList aber nicht anbieten, ohne sehr viel Zeit zu haben...

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Do 29.03.07 13:02 
Wenn deine Zeilen eine feste Länge haben, kannst du auch die ganze Zeile in eine Variable lesen. Und wenns sehr lange dauert, nimm lieber einen TMemoryStream, das brachte bei mir einen Unterschied von ~Faktor 10.