Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eigenes Zeichen für Zeilenende bei ReadLN (https://www.delphipraxis.net/174953-eigenes-zeichen-fuer-zeilenende-bei-readln.html)

Perlsau 21. Mai 2013 18:16

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Hallo Uwe, da hab ich wieder was dazugelernt :!: Dafür danke ich dir :thumb:

Zitat:

Zitat von Uwe Raabe (Beitrag 1215981)
Als 64-Bit funktioniert es dann aber.

Hab mir eben mal kurz Lazarus installiert, mit dem der TE ja offenbar arbeitet:

Das war ein Irrtum, ich hatte es in XP-64 gestestet:
Zitat:

Dort gibt es keine Fehlermeldung, wenn ich dieselbe Datei mit LoadFromFile in eine Stringlist lade, und das auf XP Pro 32. Ergo könnte er doch zumindest eine Stringlist verwenden, um seine 200 MB-Datei einzulesen. Da scheint Lazarus gegenüber Delphi was voraus zu haben ... Allerdings scheint Lazarus Probleme mit Unicode-Dateien zu haben ... Naja, sei's drum, ich will da jetzt nicht tiefer einsteigen in die Programmierung mit Lazarus.
Unter XP-32 taucht dieselbe Fehlermeldung auch unter Lazarus auf ...

Zitat:

Zitat von Uwe Raabe (Beitrag 1215981)
Man könnte jetzt natürlich TStringList ableiten, LoadFromStream überschreiben und für große Dateien effizienter implementieren.

Wer das kann? Mir wäre das zuviel an Aufwand ...

jaenicke 21. Mai 2013 19:13

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Zitat:

Zitat von Perlsau (Beitrag 1215982)
Zitat:

Zitat von Uwe Raabe (Beitrag 1215981)
Man könnte jetzt natürlich TStringList ableiten, LoadFromStream überschreiben und für große Dateien effizienter implementieren.

Wer das kann? Mir wäre das zuviel an Aufwand ...

Naja, für LoadFromFile im Grunde meine Unit zum Einlesen und intern noch das Arrayhandling verbessern, das wars schon. Also so viel ist das nicht.

Ginko 21. Mai 2013 21:54

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
So ich habs mal mit dem Filestream gemacht. Das geht gar nicht, also von der Geschwindgkeit her ...
Bei einer Textdatei von 8Mb brauchte das ca 36s, mit ReadLn und angepassten TextBuffer hingegen nur ca 65ms.
Delphi-Quellcode:
var
  FileStrm1: TFileStream;
  Ch: Char;
  GesLength: Integer;
  Gesucht,Seite: String;
  StrList1: TStringList;
begin
  Gesucht:= ( UTF8Decode( Edit1.Text ) );

  StrList1:= TStringList.Create;
  FileStrm1:= TFileStream.Create('Textdatei.txt',fmOpenRead);
  try
    GesLength:= 0;

    while FileStrm1.Position < FileStrm1.Size do
    begin
      Seite := '';
      while (FileStrm1.Read(Ch, 1) = 1) and ( Ch <> #12 ) do //Seite in String speichern
        Seite := Seite + Ch;
       
      ...
      {Textsuche und weitere Auswertung, Ergebnisse in Stringlist speichern...}
      ...  

      GesLength:= GesLength + SeitenLength + 1;
    end;

  finally
    FreeAndNil(StrList1);
    FreeAndNil(FileStrm1);
  end
Ich werde mir noch die Klasse von jaenicke ansehen. Danke für den Hinweis.

hathor 21. Mai 2013 23:12

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Wenn die Textstruktur erhalten bleiben soll, muss man es auch so einlesen:
- zeilenweise vom Zeilenanfang bis Zeilenende #13#10
- seitenweise bis zum 1. Auftreten von #12, dann vom 1.Zeichen nach #12 bis zum nächsten #12 usw.

Steuerzeichen:
0001100,0xc,12,FF=Form Feed - Setzt Cursor auf Zeilenvorschub einer vorangegangenen Zeile

Sir Rufo 22. Mai 2013 00:24

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Das ist auch nicht weiter verwunderlich :) schickst du doch den FileStream immer wieder an das Ende der Datei und dann zurück an die aktuelle Leseposition (
Delphi-Quellcode:
FileStrm1.Size
).

Darum solltest du dir die Größe des Streams zwischenspeichern, dann sollte das erheblich schneller vonstatten gehen ;)

Delphi-Quellcode:
var
  FileStrm1: TFileStream;
  LStreamSize : Int64; // lokale Variable
  Ch: Char;
  GesLength: Integer;
  Gesucht,Seite: String;
  StrList1: TStringList;
begin
  Gesucht:= ( UTF8Decode( Edit1.Text ) );

  StrList1:= TStringList.Create;
  FileStrm1:= TFileStream.Create('Textdatei.txt',fmOpenRead);
  try
    GesLength:= 0;

    // Stream-Size merken
    LStreamSize := FileStrm1.Size;

    // und damit prüfen
    while FileStrm1.Position < LStreamSize do
    begin
      Seite := '';
      while (FileStrm1.Read(Ch, 1) = 1) and ( Ch <> #12 ) do //Seite in String speichern
        Seite := Seite + Ch;
       
      ...
      {Textsuche und weitere Auswertung, Ergebnisse in Stringlist speichern...}
      ...  

      GesLength:= GesLength + SeitenLength + 1;
    end;

  finally
    FreeAndNil(StrList1);
    FreeAndNil(FileStrm1);
  end

Furtbichler 22. Mai 2013 07:11

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Es wird 2x geprüft, ob noch Zeichen da sind, und zwar einmal beim Abfragen der Position und dann nochmal ob das Lesen eines Zeichens funktioniert hat. Das ist nicht schön.

Ich würde eine Funktion schreiben, die genau eine Seite liefert und True/False, ob noch weitere Seiten zu erwarten sind.

Delphi-Quellcode:
Function ReadOnePage (myFileStream : TStream; Var Page : String) : boolean;
Const
  CharSize = SizeOf(Char);
Var
  Ch : Char;

Begin
  result := True;
  Page := '';
  While myFileStream.Read(Ch,CharSize) = CharSize do
    if Ch=#12 then
      exit
    else
      Page := Page + Ch;

  result := false;
End;

// Der eigentliche Aufruf ist dann ziemlich selbsterklärend
While ReadOnePage (myFileStream, Page) Do
  ProcessPage(Page)

Ginko 22. Mai 2013 09:05

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
@Furtbichler Danke für den Hinweis, allerdings konnte mit der Funktion keinen wesentlichen unterschied merken, auch ca 36s für die Suche von ca 2200 Wörtern.

Zitat:

Zitat von Sir Rufo (Beitrag 1216003)
Darum solltest du dir die Größe des Streams zwischenspeichern, dann sollte das erheblich schneller vonstatten gehen ;)

Das werd ich mal noch versuchen Danke für die Antworten nochmal. Hab den Beitrag grad übersehen...

jaenicke 22. Mai 2013 11:11

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Wie schon geschrieben, mit der MMF wie ich es mache, geht es natürlich deutlich schneller als zeichenweise aus der Datei selbst zu lesen.

Das Problem hatte ich als ich für einen Registryeditor die .reg Dateien einlesen wollte. Und dort konnte ich dann eine solche 350 MiB Datei in wenigen Sekunden komplett einlesen und parsen.

Furtbichler 22. Mai 2013 17:50

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Zitat:

Zitat von Ginko (Beitrag 1216016)
@Furtbichler Danke für den Hinweis, allerdings konnte mit der Funktion keinen wesentlichen unterschied merken, auch ca 36s für die Suche von ca 2200 Wörtern.

Das sollte auch nur den Code besser lesbar gestalten. Das Einlesen in einen Puffer, um ihn dann zeichenweise in einen zweiten zu kopieren, um dann in Selbigem zu suchen ist -nun ja- dezent suboptimal, würde ich sagen.

Wenn Du an der Performance herumschrauben willst, dann versuche mal, den Algorithmus zu verbessern. Ach, und nimm endlich Sebastian Jänicke's MMF-Teil.

Ginko 23. Mai 2013 09:32

AW: Eigenes Zeichen für Zeilenende bei ReadLN
 
Zitat:

Zitat von Furtbichler (Beitrag 1216099)
Das sollte auch nur den Code besser lesbar gestalten.

Ok das war ein Missverständnis, besser lesbar wird er so ja.

Zitat:

Zitat von Furtbichler (Beitrag 1216099)
Ach, und nimm endlich Sebastian Jänicke's MMF-Teil.

aye aye, sir :mrgreen:

Den Teil hatte ich schon ausprobiert, allerdings wollte ich das "kleine Problem" nicht gleich mit einer neuen Unit erschlagen. Muss man auch nicht wenn man bauminas ersten Vorschlag etwas anpasst, dann hat man eine schnelle und einfache Lösung.
Gut Jänicke's MMF-Teil ist noch ein wenig schneller, aber da habe ich auch noch ein Problem mit. Ich habe den Delimiter auf #12 gestellt um die Seiten ganz zu erfassen. Schaut man sich die Zeile (bzw. Seite) im Debugger an, fehlt allerdings das erste Zeichen einer Zeile (bzw. Seite) im zweiten Durchlauf. Das liegt sicher daran das ja sonst die zwei Zeichen #13#10 benutzt werden. Gibt es da noch eine Option die ich übersehen habe oder muss man was umschreiben ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.
Seite 4 von 5   « Erste     234 5      

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