Einzelnen Beitrag anzeigen

Cakotay

Registriert seit: 6. Aug 2005
5 Beiträge
 
#7

Re: große Textdatei einlesen und filtern

  Alt 8. Aug 2005, 14:43
Ich hab es nun endlich hinbekommen das es läuft, ist zwar vielleicht nicht die schnellste Methode aber es läuft. Hier mal der Code falls es jemanden interessiert.

Falls noch jemand eine schneller Möglichkeit einfällt kann er es ja mal posten.

Danke @ Mystic für den Tipp mit TStringStream

Delphi-Quellcode:
var
        dateiname :string;
        puffer :TStringStream;
        my_filestream :TFileStream;
        puffer2 :string;
        start :integer;
        ende :integer;
begin
        if OpenDialog1.Execute then
        begin
                dateiname := OpenDialog1.FileName;
                try
                        my_filestream := TFileStream.Create(dateiname, fmOpenread); //Datei in FileStream laden
                        puffer := TStringStream.Create('');
                        puffer.CopyFrom(my_filestream, my_filestream.Size); //Daten aus FileStream in StringStream kopieren
                        my_filestream.Free;
                        puffer.Seek(0, soFromBeginning); //Zeiger auf den Anfang setzen
                        puffer2 := puffer.ReadString(puffer.Size); //StringStream in String laden
                while (pos('<table width=519>', Puffer2) > 0) do //Parsen
                begin
                        start := pos('<table width=519>', Puffer2);
                        ende := pos('</table>', Puffer2) + 7;
                        while ende < start do
                        begin
                                delete(Puffer2, 1, ende);
                                start := pos('<table width=519>', Puffer2);
                                ende := pos('</table>', Puffer2) + 7;
                        end;
                        Memo1.Lines.Add(copy(Puffer2, start, ende - start + 1));
                        delete(Puffer2, 1, ende);
                end;
                finally
                puffer.Free;
                my_filestream.Free;
                end;
        end;

end;
EDIT: habe wie einen Beitrag weiter unten empfohlener Weise aus dem "try..except..end"-Block einen "try..finally..end"-Block gemacht. Ausserdem hab ich noch einen kleinen Fehler gemerkt und ausgebessert (die Endposition kann vor der Startposition liegen). Ist jetzt denke ich mal mit der zusätzlichen while ... do behoben.
  Mit Zitat antworten Zitat