![]() |
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; ... |
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: |
Re: Gibts eine ReadLn alternative?
Gut dass du fragst, Peter.
Delphi-Quellcode:
Bin mir nicht sicher, ob jeder TextFile-Fetischist sofort den Wert dieses unscheinbaren Codes erkennt...
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; 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. |
Re: Gibts eine ReadLn alternative?
Coool.
Ich hoffe, dass ich das in meine Bibliothek aufnehmen darf. Du wirst natürlich als Ersteller dokumentiert! |
Re: Gibts eine ReadLn alternative?
Natürlich darfst du, sonst hätte ich mein Schatzkästchen gar nicht aufgemacht.
marabu |
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