Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text Dateien (500mb+) in einen String einlesen (https://www.delphipraxis.net/31754-text-dateien-500mb-einen-string-einlesen.html)

FAlter 13. Okt 2004 15:26

Re: Text Dateien (500mb+) in einen String einlesen
 
Ich würde dann aber bei GetMem mehr nehmen (4096) als bei BlockSize (3072) und eben notfalls (ReAllocMem) Speicher nachladen, nicht immer.

Der Rückgabewert ist ein Integer, und zwar die Anzahl der tatsächlich gelesenen Bytes

endeffects 13. Okt 2004 19:56

Re: Text Dateien (500mb+) in einen String einlesen
 
also zur zeit schaut das ganze wie folgt aus:

Code:
const
BlockSize = 1024;
var SrcStream, DestStream: TFileStream;
    FileName, FileName2, Buffer: String;
    N, ChunkLen :integer;
begin
  FileName:= 'dump1.txt';
  FileName2:= 'dump2.txt';
  SrcStream:=TFileStream.Create(FileName,fmOpenread or fmShareDenyNone);
  DestStream:=TFileStream.Create(FileName2,fmCreate);
  try
    N:=SrcStream.Size;
    while N>0 do
      begin
        if N>BlockSize
          then ChunkLen:=BlockSize
          else ChunkLen:=N;
        SetLength(Buffer,ChunkLen);
        srcStream.ReadBuffer(Buffer,ChunkLen);
        N:=N-ChunkLen;
        FastReplace(Buffer,'\n', '', False);
        DestStream.WriteBuffer(Buffer,Length(Buffer));
      end;
  finally
    SrcStream.Free;
    DestStream.Free;
  end;
endet allerdings in einer Zugriffsverletzung unbekannter Herkunft =(

FAlter 13. Okt 2004 20:03

Re: Text Dateien (500mb+) in einen String einlesen
 
Zitat:

Zitat von endeffects
Delphi-Quellcode:
...
        DestStream.WriteBuffer(Buffer,Length(Buffer));
...
endet allerdings in einer Zugriffsverletzung unbekannter Herkunft =(

Ja, nach 4 Bytes ist Schluss, der String selbst ist nur ein Pointer (weshalb man ihn mit PChar typecasten kann). Du musst ab dem ersten Zeichen des Strings schreiben, also
Delphi-Quellcode:
WriteBuffer(Buffer[1], Length(Buffer))

endeffects 13. Okt 2004 20:13

Re: Text Dateien (500mb+) in einen String einlesen
 
nein das klappt leider auch noch nicht,
ich hab die abwandlung von jemanden aus einer newsgroup

im orginal sah das ganze so aus:

srcStream.ReadBuffer(PChar(Buffer),ChunkLen);
und
DestStream.WriteBuffer(PChar(Buffer),Length(Buffer ));

allerdings ging das ganze so nicht durch den compiler

FAlter 13. Okt 2004 20:20

Re: Text Dateien (500mb+) in einen String einlesen
 
Warum nimmst du nicht einfach Read oder Write oder [oh]ReadBuffer, WriteBuffer[/oh]

PS: Ich sehe keinen Grund, hier etwas anderes als Read oder Write zu verwenden, außer, du willst es dir unnötig kompliziert machen.

endeffects 13. Okt 2004 20:23

Re: Text Dateien (500mb+) in einen String einlesen
 
ich nutze doch read & writebuffer ?

FAlter 13. Okt 2004 20:29

Re: Text Dateien (500mb+) in einen String einlesen
 
Nehm doch Delphi-Referenz durchsuchenTStream.Read und Delphi-Referenz durchsuchenTStream.Write und nicht die ...Buffer-Funktionen. Dann geht es viel einfacher.

Ich weiß nicht, wozu es überhuptpt die ...Buffer gibt, jedenfalls scheint mit nach Studieren der OH, dass sie eigentlich das gleiche wie Read und Write machen. Aber nimm lieber die normalen Read und Write.

endeffects 13. Okt 2004 20:36

Re: Text Dateien (500mb+) in einen String einlesen
 
wahrscheinlich stell ich mich einfach zu dumm an

Delphi-Quellcode:
srcStream.Read(Buffer,ChunkLen);
N:=N-ChunkLen;
DestStream.Write(Buffer[1],Length(Buffer));
erzeugt auch eine zugriffsverletzung

FAlter 13. Okt 2004 20:39

Re: Text Dateien (500mb+) in einen String einlesen
 
Du musst es beim Lesen genauso wie beim schreiben machen, Buffer[1] und nicht Buffer. Das sollte man sich angewöhnen, wenn man bei Streams mit Strings arbeitet.

http://www.delphi-groups.de/YaBBSe/i...=22608;start=0

[edit=Admin]BBCode korrigiert. Mfg, Daniel[/edit]

endeffects 13. Okt 2004 20:50

Re: Text Dateien (500mb+) in einen String einlesen
 
oh danke für deine gedult *gg*
auf jeden fall gibts nun keine zugriffsverletzung mehr,
allerdings wenn ich nun versuche die inhalte aus dem buffer
auf folgendem weg zu parsen dann erhalte ich ein wildes ascii kaos

Code:
        SetLength(Buffer,ChunkLen);
        srcStream.Read(Buffer[1],ChunkLen);
        N:=N-ChunkLen;
        DumpFile:= FastReplace(Buffer[1],'\n', '', False);
        DestStream.Write(DumpFile,Length(Buffer));


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Seite 2 von 3     12 3      

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