Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.
Seite 1 von 2  1 2      

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