![]() |
Anzahl Zeilen in einem Textfile
Hallo
Ich möchte die Anzahl Zeilen in einem Textfile auslesen (Typ: textfile). Sollte das nicht mit
Delphi-Quellcode:
funktionieren?? Mir werden aber immer genau die Hälfte der Zeilen ausgegeben.... :gruebel:
anzZeilen := FileSize(filename);
Gruss Tom |
Re: Anzahl Zeilen in einem Textfile
also laut Hilfe
Zitat:
|
Re: Anzahl Zeilen in einem Textfile
hmm... das heisst alle Zeilen mit ReadLn einlesen und inkrementieren bis EoF erreicht?
|
Re: Anzahl Zeilen in einem Textfile
Ist vielleicht umständlich, aber dürfte funzen :
Delphi-Quellcode:
Gruß
var
txt: textfile; anzahl: integer; begin AssignFile(txt, 'xyz.txt'); reset(txt); while not EOF(txt) do begin inc(anzahl); end; CloseFile(txt); ShowMessage(IntToStr(anzahl)); end; MarcusB |
Re: Anzahl Zeilen in einem Textfile
Hi,
Probier mal diese Funktion:
Delphi-Quellcode:
function TextLineCount_BufferedStream(const Filename: TFileName): Integer;
const MAX_BUFFER = 1024 *1024; var oStream: TFileStream; sBuffer: string; iBufferSize: Integer; iSeek: Integer; bCarry: Boolean; begin Result := 0; bCarry := False; oStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try SetLength(sBuffer, MAX_BUFFER); repeat iBufferSize := oStream.Read(sBuffer[1], MAX_BUFFER); if iBufferSize <= 0 then break; {Skip LFs that follow a CR - even if it falls in seperate buffers} iSeek := 1; if bCarry and (sBuffer[1] = #10) then Inc(iSeek); while iSeek <= iBufferSize do begin case sBuffer[iSeek] of #10: Inc(Result); #13: if iSeek = iBufferSize then Inc(Result) else if sBuffer[iSeek + 1] <> #10 then Inc(Result) else begin Inc(Result); Inc(iSeek); end; end; Inc(iSeek); end; {Set carry flag for next pass} bCarry := (sBuffer[iBufferSize] = #13); until iBufferSize < MAX_BUFFER; finally FreeAndNil(oStream); end; end; |
Re: Anzahl Zeilen in einem Textfile
Hallo,
wie wäre es damit?
Delphi-Quellcode:
var sl:TStringList;
... sl:=TStringList.Create; try sl.LoadFromFile('c:\test.txt'); ShowMessage(Format('Datei enthält %d Zeilen.', [sl.Count])); finally sl.Free; end; // try |
Re: Anzahl Zeilen in einem Textfile
Jo, bei Textfiles empfiehlt der Apotheker TStringList. :wink:
@MarcusB Dein Code zählt sich tot. 8) |
Re: Anzahl Zeilen in einem Textfile
Danke. Das mit der Stringliste hört sich ganz gut an... Jetzt dazu noch ein kleines Problem: Wie kann ich eine Strinliste mit dem Inhalt einer geöffneten Datei befüllen? Also so in etwas:
Delphi-Quellcode:
Oder muss ich das File erst schliessen? Oder jede Zeile mit ReadLn aus File lesen (ist etwas umständlich nur um an die Anzahl zu kommen....)
WriteLn(File,Text); //File befüllen
meineStringListe.ladeVon(File); //File in meineStrinListe laden anzahl := meineStringListe.count; //Zeilen zählen es dankt und grüsst Tom |
Re: Anzahl Zeilen in einem Textfile
Gollum hat mit seinem Beitrag die Frage bereits, mit Code-Beispiel, beantwortet :wink:
|
Re: Anzahl Zeilen in einem Textfile
:gruebel: Gollums Datei ist aber geschlossen und nicht wie meine Datei geöffnet... Geht das trotzdem irgendwie?
|
Re: Anzahl Zeilen in einem Textfile
Probier es aus. Aber wenn man eine Datei nicht mehr braucht, sollte man sie generell sofort schließen. Was hindert dich also daran, sie erst zu schließen und dann die Anzahl der Zeilen zu ermitteln?
|
Re: Anzahl Zeilen in einem Textfile
ich möchte die Anzahl Zeilen am Schluss derselben Datei einfügen... (Theoretisch könnte ich sie natürlich schliessen, auslesen und wieder öffnen aber wenn's nicht unbedingt sein muss...)
|
Re: Anzahl Zeilen in einem Textfile
Wie schreibst du denn rein? Zähl duch die Aufrufe von writeln mit und schreib mit der letzten writeln-Anweisung die Zeilen rein.
|
Re: Anzahl Zeilen in einem Textfile
Zitat:
Und zur späteren Thematik: Wenn du etwas der Datei anfügen möchtest, kannst du es der TStringList anfügen und danach auf quasi demselben Wege (via SaveToFile) wieder zurück auf die Platte schreiben. Sieh in Online-Hilfe bei TStringList, was damit alles schönes möglich ist. Danach wirst du keine Textdateien mehr öffnen und schließen wollen. :zwinker: |
Re: Anzahl Zeilen in einem Textfile
loadFromFile erwartet einen String (FileName)... ich habe jedoch eine geöffnete Datei (Typ Text). Ich denke das geht so nicht... Das mit dem WriteLn zählen würde aber wohl funktionieren... Dazu aber noch etwas: Wenn ich die Anzahl tatsächlich mit dem letzen WriteLn schreiben möchte, aber nicht am Schluss der Datei sondern am Anfang... Kann ich das mit Seek(Datei, 0) und dann eine WriteLn machen?
|
Re: Anzahl Zeilen in einem Textfile
Zitat:
Und ich wiederhole, dass wenn du TStringList lieben und anwenden gelernt hast, du keine Textdatei jemals wieder öffnest. :twisted: Achja, und für den Fall, dass ich ins Leere rede - zu deinen Seek- und WriteLn-Fragen: Probier's einfach aus. Geht wahrscheinlich schneller, als hier eine Antwort zu bekommen. :zwinker: |
Re: Anzahl Zeilen in einem Textfile
Zitat:
Vielleicht noch ein readln reinpfrimeln :wink: Aber hat sich ja eh erledigt, die Lösung mit der Stringlist ist prima! |
Re: Anzahl Zeilen in einem Textfile
ok, ich probier alles mal aus....
das mit der StringList begreife ich allerdings nicht so ganz... irgendwie muss ich meine Daten ja weiter geben können :roll: |
Re: Anzahl Zeilen in einem Textfile
Zitat:
Also, du lädst die Datei in eine Stringlist, manipulierst sie da nach belieben, und dann schreibst du sie mit
Delphi-Quellcode:
wieder hinaus. Die Datei liegt dann als Plaintext-Datei auf der Festplatte, ich versteh dein Problem irgendwie nicht mehr.
StringList1.SaveToFile(<Dateiname>);
[add]Das Stichwort hier lautet Delphi-OH[/add] |
Re: Anzahl Zeilen in einem Textfile
Zitat:
|
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:... |
Re: Anzahl Zeilen in einem Textfile
Das da baue ich heut abend in meine Testreihe ein und versuche es mit den mageren 400 MB. :mrgreen:
|
Re: Anzahl Zeilen in einem Textfile
Zitat:
...:cat:... |
Re: Anzahl Zeilen in einem Textfile
Zitat:
Nein im Ernst, mir war eine "physikalische" Dateigrößengrenze, ab der TStringList "unwirtschaftlich" wird, nie bewusst. Ich denke jetzt aber auch, sie ist definitiv vorhanden. Nach den Zahlen und euren Schätzungen lege ich sie für mich bei 5-20 MB (je nach Anwendungsfall). Wenn eine Datei in einem Programm nur einmal durchgestöbert und zurückgeschrieben werden muss, ist es mir eigentlich egal, ob das eine halbe oder 3 sek dauert. Bis dahin ist TStringList vom Handling her unschlagbar. :stupid: |
Re: Anzahl Zeilen in einem Textfile
Zitat:
|
Re: Anzahl Zeilen in einem Textfile
@Sakura: das ASM Programm braucht bei mir bei 480 MB 32-34 Sek. und stürzt manchmal ab. 8) Das readln Programm braucht 32-34 Sek. :mrgreen:
Kann dir die original-Datei gerne mal zuschicken. :shock: |
Re: Anzahl Zeilen in einem Textfile
Zitat:
Aber ich habe zu Hause 120GB freien Speicherplatz, ich kann es ja mal testen :angle: ...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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