![]() |
Re: Anzahl Zeilen in einem Textfile
Zitat:
Obwohl :gruebel: , ab welcher Datei-Größe würdest du denn von TStringList abweichen? |
Re: Anzahl Zeilen in einem Textfile
Zitat:
|
Re: Anzahl Zeilen in einem Textfile
Zitat:
[OT] 300 - 500 MB ... Dein Tagebuch? *fg* [/OT] |
Re: Anzahl Zeilen in einem Textfile
Ich habe das Thema jetzt nur überflogen, aber anfangs gings hier drum :
Zitat:
Delphi-Quellcode:
Die paar Zeilen sind das kompette Programm !! Ohne Stringlist und sonstigen Firlefanz. Und 500 MB :shock: sind dem auch egal.
var d : TextFile;
i : integer; begin i := 0; AssignFile (d,'meintext.txt'); reset (d); while not eof (d) do begin readln (d); i := i + 1; end; showmessage (IntToStr (i))+ ' Zeilen'); end. |
Re: Anzahl Zeilen in einem Textfile
Zitat:
|
Re: Anzahl Zeilen in einem Textfile
Sorry, aber irgendwie macht ihr das ganze ziemlich unperformant. Wozu immer Readln? Da wird erst geprüft wo ein Zeileumbruch ist und dann erst in den buffer eingelesen.
Ich würde die datei per TFileStream öffnen und dann in einer schleife die gesamte datei durchgehen und prüfen wann ein #13 und anschließend ein #10 kommt. Die Zeilenanzahl kann dann einfach angehängt werden in dem die datei im append-modus geöffnet wird Natürlich auch nicht jedes zeichen einzeln lesen sondern einen ziemlich großen buffer einmal allozieiren und den buffer dann durchgehen... |
Re: Anzahl Zeilen in einem Textfile
Hallo
Anschliessend mal den Code, wie ich ihn jetzt verwende... Ich hoffe er ist verständlich. Funktioniert, aber ist vielleicht nicht so sauber:
Delphi-Quellcode:
Gruss
OFile : Textfile;
AssignFile(OFile,FileName); Rewrite(OFile); TmpStr := 'abc'; WriteLn(OFile,TmpStr); //manchmal müssen hier mehrer Zeilen eingefügt werden for Lp := 0 to StringListe.Count-1 do Writeln(OFile, StringListe.Strings[Lp]); Reset(OFile); while not Eof(OFile) do begin ReadLn(OFile, TmpStr); StringListe2.Add(TmpStr); end; TmpStr := 'abc'; //abc = AnzahlZeilen --> von StringListe + obigen Anz. TmpStr abhängig StringListe2.Insert(0, TmpStr); //abc muss unbedingt am Anfang eingefügt werden Rewrite(OFile); for Cnt := 0 to StringListe2.Count-1 do Writeln(OFile, StringListe2.Strings[Cnt]); CloseFile(OFile); Tom |
Re: Anzahl Zeilen in einem Textfile
Ah ja Gollums Beitrag habe ich nicht gesehen. 8) Ich habe einige größere Textdateien, die in eine Interbase Datenbank rein müssen. Da mir für so etwas nie eine Stringlist eingefallen wäre, habe ich deshalb mal eine kleine Testreihe gemacht, die ziemlich eindeutige Ergebnisse liefert:
1. Versuch : 400 MB, mein Vorschlag : 27 sek., mit der stringlist "out of memory" 2. Versuch : 120 MB, mein Vorschlag : 12 sek., mit der stringlist 334 sek. nur lesen, das free schätze ich zusätzlich noch auf 1-2 Min. Das ging nur einmal. Beim 2. Versuch blieb Rechner sogar hängen. 3. Versuch : 20 MB 570 ms, Stringliste 2994 ms Insofern schätze/behaupte ich mal, über 2 MB ist die Stringliste "Firlefanz". :mrgreen: [EDIT] Was natürlich auch heißt, daß sie für kleinere Sachen schon brauchbar ist. Der Performanceverlust und Speicherbedarf ist dann wohl kaum zu bemerken. |
Re: Anzahl Zeilen in einem Textfile
Zitat:
|
Re: Anzahl Zeilen in einem Textfile
Hier mal die Anzahl der Zeilen aus einer Datei in einer eigenen Funktion ;)
Delphi-Quellcode:
Okay, ich gebe es, ich wollte mal wieder mit Assembler rumspielen :mrgreen:
function CountLines(aFileName: string): Integer;
const BUF_SIZE = 4096; var Buffer: array[0..Pred(BUF_SIZE)] of Byte; Cnt: Integer; FS: TFileStream; begin FS := TFileStream.Create(aFileName, fmOpenRead or fmShareDenyWrite); try Result := 0; repeat Cnt := FS.Read(Buffer[0], BUF_SIZE); asm // load data count mov EAX, Cnt dec EAX js @@NoData // no data // load current line count mov ECX, Result // loop data buffer @@LoopBuffer: // compare byte in memory cmp byte ptr[Buffer + EAX], $0A jnz @@CheckDataLeft // not a line break (#10) // increment line count inc ECX // goto next byte @@CheckDataLeft: dec EAX jns @@LoopBuffer // return result mov Result, ECX @@NoData: end; until Cnt < BUF_SIZE; finally FS.Free; end; end; ...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 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