Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei schnell verarbeiten (https://www.delphipraxis.net/35574-textdatei-schnell-verarbeiten.html)

Jörn 9. Dez 2004 10:06


Textdatei schnell verarbeiten
 
Hallo!
Ich möchte große Textdateien (bis 10 MB oder größer) zeilenweise nach einem String durchsuchen. Wenn dieser in einer Zeile vorhanden ist, soll die Zeile in ein StringList kopiert werden. Wie mache ich das möglichst schnell?

MfG

IngoD7 9. Dez 2004 10:26

Re: Textdatei schnell verarbeiten
 
Textdatei in StringList einlesen und Zeile für Zeile prüfen. Ist der gesuchte String in einer Zeile nicht vorhanden, dann die Zeile aus der StringList löschen. Übrig bleibt die Liste mit den Zeilen, in denen der String vorkommt.

Ich weiß aber nicht, ob das viele Löschen schneller geht, als das kopieren in eine zweite Liste. In jedem Falle sollte die Liste bei der Lösch-Variante von hinten durchsucht werden, damit beim Löschen einer Zeile nicht immer alle anderen nachrücken müssen.

jim_raynor 9. Dez 2004 10:32

Re: Textdatei schnell verarbeiten
 
Ich glaube bei einer 10 MB datei ist es besser auf die alten Delphi-Sachen AssignFile, Reset, ReadLn zurückzugreifen und so die Datei zeilenweise einlesen. Mit Pos kann man dann eine Zeile prüfen und eventuell der Stringlist hinzufügen

alcaeus 9. Dez 2004 11:22

Re: Textdatei schnell verarbeiten
 
Zitat:

Zitat von jim_raynor
Ich glaube bei einer 10 MB datei ist es besser auf die alten Delphi-Sachen AssignFile, Reset, ReadLn zurückzugreifen und so die Datei zeilenweise einlesen. Mit Pos kann man dann eine Zeile prüfen und eventuell der Stringlist hinzufügen

Das wuerde ich nicht sagen. Ich habe festgestellt dass genau diese alten Funktionen verdammt langsam sind.
Einfacher ist es sicher, die Datei zu laden, und anschliessend von unten nach oben ueberpruefen ob die Zeile den text enthaelt. Dabei ist zu sagen, dass auch die Pos-Funktion nicht gerade ein Schnellzug ist.

Greetz
alcaeus

IngoD7 9. Dez 2004 12:58

Re: Textdatei schnell verarbeiten
 
Zitat:

Zitat von alcaeus
Dabei ist zu sagen, dass auch die Pos-Funktion nicht gerade ein Schnellzug ist.

Aber was nützt es - so ohne jede Alternative?

hitzi 9. Dez 2004 13:04

Re: Textdatei schnell verarbeiten
 
Such mal nach Memory Mapped Files. :???:

Gruss

Jörn 9. Dez 2004 13:14

Re: Textdatei schnell verarbeiten
 
Memory Mapped Files ist stark übertrieben - so groß sind meine Dateien auch nicht. Ich werde es mal mit der Stringlist testen ob das schnell genug ist. Dachte gibt evtl was schnelleres und schöneres, aber mal sehen.

Luckie 9. Dez 2004 13:16

Re: Textdatei schnell verarbeiten
 
Ich hatte mal die Aufgabe 30 MB große Textdateien und größer in mehrer Textdateienaufzuteilen (jeweils nach einer Leerzeile). Ihc habe auch mit StringListen gearbeitet und es ging eigentlich relativ flott.

shmia 9. Dez 2004 15:29

Re: Textdatei schnell verarbeiten
 
Zitat:

Zitat von Jörn
Ich möchte große Textdateien (bis 10 MB oder größer) zeilenweise nach einem String durchsuchen. Wenn dieser in einer Zeile vorhanden ist, soll die Zeile in ein StringList kopiert werden.

Nur wenn die Daten in grossen Blöcken (min. 64 kb) in den Speicher gelesen werden, kann die
Suche schnell vonstatten gehen.
Die Variante mit readln scheidet damit aus, weil immer nur sehr kleine Datenmengen eingelesen werden;
dass bringt viel Overhead mit sich.
Die Arbeit mit TStringlist geht recht fix und angenehem, hat aber den Nachteil, dass sehr grosse Dateien (> 100 MB) grosse Speicher Resourcen verbraten.
Am Schnellsten:
Datei mit TFileStream öffnen, grosse Blöcke (64kb bis 4 MB) mit BlockRead einlesen.
Den Block mit einem schnellen Suchverfahren durchsuchen (Boyer-Moore).
Beim Einlesen des nächsten Blocks muss man aufpassen und per Seek einige Bytes zurückpositionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.

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