Einzelnen Beitrag anzeigen

dose

Registriert seit: 12. Jul 2006
11 Beiträge
 
#5

Re: schnelles Textzeilen auslesen ab Position x

  Alt 7. Aug 2006, 08:20
Hallo,
Vielen Dank für die Tips.
Ich habe mir die Unit File64 angeschaut, aber leider funktionieren dort die Positionszeiger nicht so ganz sauber wie ich mir das vorstelle. Daher möchte ich das lieber auf 32 bit realisieren.

Anbei mein Code, der eine Datei durchforstet und jeweils bei CrLf eine neue Zeile ausgibt. (Siehe Ausgabe).
Ich habe trotzdem das Gefühl dass das nicht sonderlich Performant (vermutlich zuviele Variablenzuweisungen) ist, bzw. teilweise sogar nicht sauber funktioniert. (wenn Startposition und Endposition nicht die gesamte Datei beinhalten).
Prinzipiell arbeitet der Code so, dass der den Buffer dessen größe in MAXLINELENGTH festgelegt wird in eine Variable ließt und untersucht. Der Rest nach dem Zeilenumbruch wird dann in die Variable Linebuffer übernommen und die Abarbeitung beginnt von neuem.

Habt jemand von euch noch einen optimierungs Tip? Ich wäre sehr dankbar.



Delphi-Quellcode:
const
  MAXLINELENGTH = 128;
  FileName = 'c:\in.file';
var
  curr, feof, readlen, tmppos: Longint;
  startpos, Stoppos: Longint;
  Buffer : array [0..MAXLINELENGTH] of char;
  p : PChar;
  f : integer;
  Line : string;
  LineBuffer : string;
  text : string;

begin

  f := FileOpen (FileName, 0);

  feof := FileSeek (f, 0, 2);
  // feof = Größe der Datei (wo das Lesen


  Startpos := 0;
  // Startpos setzt den Dateizeiger dorthin wo das Einlesen begonnen werden soll
  Stoppos := feof;
  // Wir wollen jetzt mal exemplarisch die gesammte Datei bearbeiten...


  FileSeek (f, 0, 0);
  // Dateizeiger an den Anfang der Datei

  curr := FileSeek (f, 0, 1);
  // Aktuelle Position in curr einlesen
  LineBuffer := '';
  while (curr < stoppos do
   begin
      if ((curr + MAXLINELENGTH )> stoppos then
        begin
           readlen := stoppos- curr;
        end
      else
        begin
           readlen := MAXLINELENGTH;
        end;
      FileRead(f, Buffer, readlen);
      p := StrScan (Buffer, #10);
      if p = Nil then
        begin
          if (StrScan (Buffer, #13) = Nil) then
            begin
              Line := Copy(Buffer,0,MAXLINELENGTH);
            end
          else
            begin
              Line := Copy(Buffer,0,MAXLINELENGTH-1);
            end;
          LineBuffer := LineBuffer + Line;
        end
      else
        begin
          Line := Copy(Buffer,0,(p-@Buffer-1));
          text := LineBuffer + Line;
          LineBuffer := '';
          FileSeek (f, 0-readlen+(p-@Buffer)+1, 1);


          Memo1.Lines.Add(text);
     // Exemplarische Ausgabe


        end;
      curr := FileSeek(f, 0, 1);
   end;
  FileClose (f);
end;
  Mit Zitat antworten Zitat