AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gibts eine ReadLn alternative?

Ein Thema von ken_jones · begonnen am 20. Jul 2005 · letzter Beitrag vom 21. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 11:09
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?
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#2

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 11:12
vllt
TStringStream
oder
TStringlist
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 11:23
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?
Peter
  Mit Zitat antworten Zitat
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 11:33
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 ) 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!!
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 12:23
Dann hau den IBMlern mal auf die Finger
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.
Peter
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 13:36
Hi Ken,

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
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 13:59
Vergiss es, Du willst ja die Sonderzeichen mit in der Anzahl haben

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

Gruß Igotcha
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 14:04
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.
Peter
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#9

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 14:11
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]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Gibts eine ReadLn alternative?

  Alt 20. Jul 2005, 14:16
Hi Peter,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz