![]() |
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? |
Re: Gibts eine ReadLn alternative?
vllt
TStringStream oder TStringlist |
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? |
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!! |
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. |
Re: Gibts eine ReadLn alternative?
Hi Ken,
Zitat:
Grüße vom marabu |
Re: Gibts eine ReadLn alternative?
Vergiss es, Du willst ja die Sonderzeichen mit in der Anzahl haben ;-)
(... hier stand mal was...) Gruß Igotcha |
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. |
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:
Und schon endet jede Zeile mit #13#10 ;)
procedure TForm1.Create(Sender: TObject);
begin Memo1.Lines.LoadFromFile(DATEINAME); Memo1.Lines.SaveToFile(DATEINAME); end; 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] |
Re: Gibts eine ReadLn alternative?
Hi Peter,
Zitat:
Delphi-Quellcode:
marabu
...
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; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 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