AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl Zeilen in einem Textfile

Ein Thema von TomDooley · begonnen am 18. Mai 2004 · letzter Beitrag vom 20. Mai 2004
Antwort Antwort
Seite 3 von 4     123 4      
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Anzahl Zeilen in einem Textfile

  Alt 18. Mai 2004, 20:28
Zitat von Jens Schumann:
Da bin ich mir nicht so sicher. Ich habe es öfter mit TxT-Dateien zu tun, die zwischen 300 und 500 MB groß sind. Da nehme ich doch lieber ne normale TextFile mit Reset und Readln und so anstatt TStringList.
Gut, solche Monsterdateien habe ich nun nicht bedacht - zugegeben. Da fehlt mir auch jegliche Erfahrung. Sollten aber die Ausnahme darstellen, oder?
Obwohl , ab welcher Datei-Größe würdest du denn von TStringList abweichen?
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#22

Re: Anzahl Zeilen in einem Textfile

  Alt 18. Mai 2004, 22:00
Zitat von IngoD7:
Zitat von Jens Schumann:
Da bin ich mir nicht so sicher. Ich habe es öfter mit TxT-Dateien zu tun, die zwischen 300 und 500 MB groß sind. Da nehme ich doch lieber ne normale TextFile mit Reset und Readln und so anstatt TStringList.
Gut, solche Monsterdateien habe ich nun nicht bedacht - zugegeben. Da fehlt mir auch jegliche Erfahrung. Sollten aber die Ausnahme darstellen, oder?
Obwohl , ab welcher Datei-Größe würdest du denn von TStringList abweichen?
Weiss ich auch nicht so genau. Evt ab 3 MB
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Anzahl Zeilen in einem Textfile

  Alt 18. Mai 2004, 22:09
Zitat von Jens Schumann:
Zitat von IngoD7:
Zitat von TomDooley:
loadFromFile erwartet einen String (FileName)... ich habe jedoch eine geöffnete Datei (Typ Text).
und ich wiederhole, dass wenn du TStringList lieben und anwenden gelernt hast, du keine Textdatei jemals wieder öffnest.
Da bin ich mir nicht so sicher. Ich habe es öfter mit TxT-Dateien zu tun, die zwischen 300 und 500 MB groß sind. Da nehme ich doch lieber ne normale TextFile mit Reset und Readln und so anstatt TStringList.

[OT]
300 - 500 MB ... Dein Tagebuch? *fg*
[/OT]
Günter
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#24

Re: Anzahl Zeilen in einem Textfile

  Alt 18. Mai 2004, 22:13
Ich habe das Thema jetzt nur überflogen, aber anfangs gings hier drum :

Zitat:
Ich möchte die Anzahl Zeilen in einem Textfile auslesen (Typ: textfile).
Delphi-Quellcode:
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.
Die paar Zeilen sind das kompette Programm !! Ohne Stringlist und sonstigen Firlefanz. Und 500 MB sind dem auch egal.
Gruß
Hansa
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 11:24
Zitat von Hansa:
Die paar Zeilen sind das kompette Programm !! Ohne Stringlist und sonstigen Firlefanz.
Tja, und die paar Zeilen aus Gollums Posting sind noch kompakter - sogar mit, oder besser, wegen dem "Firlefanz".
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#26

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 13:05
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...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
TomDooley

Registriert seit: 26. Jan 2004
124 Beiträge
 
#27

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 13:30
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:
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);
Gruss

Tom
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#28

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 13:34
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".

[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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#29

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 13:38
Zitat von TomDooley:
Funktioniert, aber ist vielleicht nicht so sauber:
Du bist gut..nicht so sauber, also das ist noch sehr milde ausgedrückt. Ich versteh nicht was das ganze herumgeschreibe mit der Datei soll. Wieso verwendest du nicht eine Stringlist, fügst am Anfang deine ABC's ein, dann ganz vorne nochmal StringList1.Count und dann schreibst du das mit SaveToFile in die (inzwischen geschlossene) Datei?
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#30

Re: Anzahl Zeilen in einem Textfile

  Alt 19. Mai 2004, 13:46
Hier mal die Anzahl der Zeilen aus einer Datei in einer eigenen Funktion

Delphi-Quellcode:
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;
Okay, ich gebe es, ich wollte mal wieder mit Assembler rumspielen

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
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