Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Gibts eine ReadLn alternative? (https://www.delphipraxis.net/50066-gibts-eine-readln-alternative.html)

ken_jones 20. Jul 2005 10:09


Gibts eine ReadLn alternative?
 
Ich lese Zeile für Zeile eine grosse Textdatei aus und brauche die Zeichenzahl der Zeile.
Dies funktionierte bis heute mit ReadLn und Length+2 ohne Probleme. Jetzt aber gibt es plötzlich ein paar Zeilen im Textfile, die statt mit #13#10 nur mit #13 terminiert sind.

Das Problem: Eine Zeile wie z.B: "a#13b#13#10" wird von ReadLn so gelesen: "ab".
Length+2 gibt hier 4, richtig wäre 5.

Gibt es eine ReadLn alternative, die das #13 im Result zurückliefert oder von mir aus nur "a" statt "ab" zurückliefert?

barf00s 20. Jul 2005 10:12

Re: Gibts eine ReadLn alternative?
 
vllt
TStringStream
oder
TStringlist

Jasocul 20. Jul 2005 10:23

Re: Gibts eine ReadLn alternative?
 
Auf Anhieb fällt mir keine einfache Lösung ein, außer das ganze als untypisierte Datei zu behandeln.

Vielleicht wäre es besser, die Ursache der "falschen" Zeichen zu analysieren?

ken_jones 20. Jul 2005 10:33

Re: Gibts eine ReadLn alternative?
 
Danke!
Leider kann ich die Quelle nicht korrigieren, das Textfile kommt von einer AS/400 und die fass ich nicht an ;)
TStringList krankt am selben Problem wie ReadLn... TStringStream ist vielleicht noch eine Überlegung wert!

Ich habs jetzt temporär so gelöst, dass ich das Textfile untypisiert (Jasocul :thumb: ) in einen Buffer lade, diesen vergrössere, wenn kein #13 drin ist, etc.. Als Resultat gebe ich dann den String und (Length + Anzahl #13 + Anzahl #10) zurück. Die Performance reisst mich zwar nicht vom Hocker aber es funktioniert zumindest mal...

Danke für die Tipps!!

Jasocul 20. Jul 2005 11:23

Re: Gibts eine ReadLn alternative?
 
Dann hau den IBMlern mal auf die Finger :roll:
Die Performance kannst du deutliche erhöhen, wenn du einen größeren Puffer mit BlockRead einliest. Die Größe kannst du ja selbst bestimmen. Das packst du solange in ein dynamisches Array of Byte, bis alles drin ist. Dann kannst du da prima drin arbeiten, ohne die Datei anzufassen.
Auf die Art habe ich vor... (ist schon zu lange her) mal eine Kopier-Funktion simuliert. Die kam annähernd an die Geschwindigkeit des guten alten "copy" heran.

marabu 20. Jul 2005 12:36

Re: Gibts eine ReadLn alternative?
 
Hi Ken,

Zitat:

Zitat von ken_jones
Ich lese Zeile für Zeile eine grosse Textdatei aus und brauche die Zeichenzahl der Zeile. ... Gibt es eine ReadLn alternative, die das #13 im Result zurückliefert oder von mir aus nur "a" statt "ab" zurückliefert?

wenn du nur die Zeilenlänge bestimmen willst, dann kannst du auch weiter mit ReadLn arbeiten. Dazu merkst du dir einfach die Position in der Datei vor und nach dem Lesen einer Zeile. Die Differenz ist die Länge der Zeile inklusive CRLF.

Grüße vom marabu

Igotcha 20. Jul 2005 12:59

Re: Gibts eine ReadLn alternative?
 
Vergiss es, Du willst ja die Sonderzeichen mit in der Anzahl haben ;-)

(... hier stand mal was...)

Gruß Igotcha

Jasocul 20. Jul 2005 13:04

Re: Gibts eine ReadLn alternative?
 
Hi marabu,
ich habe das so verstanden, dass er die Sonderzeichen (CR, LF) mitzählen will. Das Problem ist eine unsaubere Datei, die auch das CR mehrfach enthalten kann. z.B. CR CR LF. Dann weiß er nicht, wieviel Zeichen er draufzählen soll, da er diese Anzahl nicht bestimmen kann.

DevilsCamp 20. Jul 2005 13:11

Re: Gibts eine ReadLn alternative?
 
Interessant.

Ich habe dein Problem mal nachgestellt und musste feststellen:

Eine Memo-Komponente kommt damit klar. Und wenn du die Datei dann noch ändern darfst, dann mach folgendes:


Delphi-Quellcode:
procedure TForm1.Create(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile(DATEINAME);
  Memo1.Lines.SaveToFile(DATEINAME);
end;
Und schon endet jede Zeile mit #13#10 ;)

Ist zwar nicht die klügste Alternative, aber sicher eine, mit der besten Performance


[edit]
Diese Methode kommt auch mit Zeilen klar wie: "a#13#13#13#13b#13#10"
[/edit]

marabu 20. Jul 2005 13:16

Re: Gibts eine ReadLn alternative?
 
Hi Peter,

Zitat:

Zitat von marabu
die Differenz (der Dateipositionen vor und nach dem Lesen einer Zeile) ist die Länge der Zeile

vielleicht habe ich mich nicht klar genug ausgedrückt, deshalb hier ein Beispiel:

Delphi-Quellcode:
...
iEnd := 0;
iLine := 0;
while not Eof(t) do begin
  iStart := iEnd;
  ReadLn(t, line);
  Inc(iLine);
  iEnd := TextPos(t);
  if Length(line) <> (iEnd - 2 - iStart) then
    WriteLn(iLine, ': ', line);
end;
...
marabu

Jasocul 20. Jul 2005 14:03

Re: Gibts eine ReadLn alternative?
 
Hmm. Gefällt mir gut. Schön einfach.
Wie ist denn der Source von der Funktion "TextPos"?
Delphi kennt die nämlich nicht. :mrgreen:

marabu 20. Jul 2005 15:01

Re: Gibts eine ReadLn alternative?
 
Gut dass du fragst, Peter.

Delphi-Quellcode:
function TextPos(var tf: TextFile): cardinal;
var
  f: TTextRec absolute tf;
begin
  if f.Mode = fmClosed then
    raise Exception.Create('TextPos: file not open');
  Result := SetFilePointer(f.Handle, 0, nil, FILE_CURRENT);
  with f do
  if (Mode = fmOutput) then
    Inc(Result, BufPos)
  else if (BufEnd <> 0) then
    Dec(Result, BufEnd - BufPos);
end;
Bin mir nicht sicher, ob jeder TextFile-Fetischist sofort den Wert dieses unscheinbaren Codes erkennt...

marabu

PS: und nicht vergessen den i/o-buffer mit SetTextBuffer() auf zig-kb raufzusetzen - mit 128 Byte standard buffer lernt die wutz das Fliegen nicht.

Jasocul 20. Jul 2005 15:07

Re: Gibts eine ReadLn alternative?
 
Coool.
Ich hoffe, dass ich das in meine Bibliothek aufnehmen darf. Du wirst natürlich als Ersteller dokumentiert!

marabu 20. Jul 2005 15:16

Re: Gibts eine ReadLn alternative?
 
Natürlich darfst du, sonst hätte ich mein Schatzkästchen gar nicht aufgemacht.

marabu

ken_jones 21. Jul 2005 20:19

Re: Gibts eine ReadLn alternative?
 
Hulla, wasn hier los? Dachte der Thread sei abgeschlossen.. Zum Glück schau ich noch mal rein!

@alle: Danke für die vielen Ansätze!

@jasocul: Ich hau mir doch nicht selber auf die Finger! :wink:

@marabu: That's it! :dancer: Nicht nur für mein aktuelles Prob, sondern generell!! Ich hab mich schon x-mal darüber geärgert, dass ich die Position im Textfile nicht bestimmen kann! Sensationell!!! Hätt ich schon vor Jahren brauchen können!
Ich bin so frei und kopier mir das auch gleich mal in meine Sammlung rein ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 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