Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeilen in einer Datei zählen (https://www.delphipraxis.net/69790-zeilen-einer-datei-zaehlen.html)

turboPASCAL 20. Mai 2006 04:59

Re: Zeilen in einer Datei zählen
 
Da stimme ich zu, was noch geht ist einen Grösseren Block zu lesen um die Geschwindigkeit zu erhöhen (Blockread).

Sharky 20. Mai 2006 07:10

Re: Zeilen in einer Datei zählen
 
Und hier mal eine kleine Anregung von mir *g*
Delphi-Quellcode:
function CountLines(const aFileName: string): Integer;
var
  DateiStream: TFileStream;
  CurrentByte: Word;
  Zeilen: Integer;
const
  LineBreak = 10;
begin
  result := -1;
  if (FileExists(aFileName)) then
  begin
    DateiStream := TFileStream.Create(aFileName, fmOpenRead);
    try
      zeilen := 0;
      if (DateiStream.Size > 0) then
      begin
        zeilen := 1;
        DateiStream.Position := 0;
        while DateiStream.Position < DateiStream.Size do
        begin
          DateiStream.Read(CurrentByte, 1);
          if (CurrentByte = LineBreak) then
          begin
            Inc(Zeilen);
          end;
        end;
      end;
    finally
      DateiStream.Free;
    end;
    result := Zeilen;
  end;
end;

procedure TDemoForm.btn_testClick(Sender: TObject);
var
  Zeilen: Integer;
begin
  Zeilen := CountLines('c:\test.txt');
  ShowMessageFmt('%d', [Zeilen]);
end;

happyaura 20. Mai 2006 14:31

Re: Zeilen in einer Datei zählen
 
Hallo, da bin ich wieder.

Erst einmal auf die frage, warum ich mich für TStrinGrid entschieden hab. Hab den datentyp noch nicht benutzt und einfach mal ausprobieren wollen. Vielen Dank für den Hinweis mit .Destroy und .Free, hatte mir die hilfe nicht angeschaut und dacht mir .destroy könnt das tun, was ich will und das tat es dann auch (irgendwie ;-) ). Außerdem

Es handelt sich nicht um große Dateien, sind kleiner als 1 MB, in sofern hab ich zeitlich keinen unterschied zu der methode von himitsu gesehen.
Aber vielleicht ist es ein wenig mit Spatzen auf Kanonen schießen (oder so ähnlich ;-) ), um so ein kleine süße Integer zu bekommen.
Nun bleibt nur noch die frage: TextFile oder FileStream, sprich Code von himitsu oder Sharky.

Vielen dank erst einmal für eure ausführlichen Erläuterungen.

Gruß Martin

P.S. Kann mir vielleicht noch jeman sagen, wie man in einer Combobox es hinbekommt, dass man dort keine Eingaben tätigen kann, sondern nur aus den vorgegebenen werten wählen kann? Ich konnte die entsprechende Einstellung leider nicht finden. Eigentlich gehört das nicht zu diesem Topic, lohnt aber kaum, ein neues Topic aufzumachen, oder?

Hawkeye219 20. Mai 2006 14:35

Re: Zeilen in einer Datei zählen
 
Zitat:

Zitat von happyaura
P.S. Kann mir vielleicht noch jeman sagen, wie man in einer Combobox es hinbekommt, dass man dort keine Eingaben tätigen kann, sondern nur aus den vorgegebenen werten wählen kann? Ich konnte die entsprechende Einstellung leider nicht finden. Eigentlich gehört das nicht zu diesem Topic, lohnt aber kaum, ein neues Topic aufzumachen, oder?

Ok, ich sage es dir auch ganz leise: TComboBox.Style = csDropDownList :wink:

Gruß Hawkeye

happyaura 20. Mai 2006 15:35

Re: Zeilen in einer Datei zählen
 
ah, vielen dank. dann ist es nicht verwunderlich, dass ich es nicht gefunden hab, war primär auf der suche nach einem boolwert, den ich auf true oder false setzen muß...

Hansa 20. Mai 2006 16:29

Re: Zeilen in einer Datei zählen
 
Zitat:

Zitat von happyaura
...Nun bleibt nur noch die frage: TextFile oder FileStream, sprich Code von himitsu oder Sharky.

Ist das denn immer noch nicht klar ? :shock: Bei himitsus Variante muß nicht extra Speicher alloziert werden. Insofern braucht man sich auch nicht um die Freigabe kümmern. Lediglich eine Variable als Puffer für readln (t,st); Stop ! Nicht mal die braucht man. readln (t); reicht zum zählen. Das ist sehr kurz zu machen. Sharkys Variante hat auch einen Vorteil : es erscheint kein .NET-Hinweis von wegen "File of : unsicherer Typ". Deshalb ist es gut, daß auch die Stream Variante hier drin steht. Falls einer seine Textdateien rausschmeißen will und nicht weiß wie das anders geht.

Aber noch ein Effekt am Rande, weil die Geschwindigkeit erwähnt wurde. Mußte auch mal zigtausend Zeilen einlesen und in DB schreiben. Der Code sah ungefähr so aus :

Delphi-Quellcode:
readln (t,st);
Memo1.Lines.Add (st);
// in DB wegschreiben
Überlegung war folgende : was in die DB muß, das könnte man ja zumindest teilweise anzeigen, um zu sehen wie weit das Programm ist. Je nach Dateigröße lief das so ca. 5 Min. Was jetzt kommt ist kein Witz ! Das wollte keiner glauben, inkl. mir ! Das Programm lief plötzlich viel schneller. Allerhöchstens noch 2 Min. Gut, völlig unmöglich : DB gelöscht. Laufen lassen : die Daten waren da, wie vorher auch schon. Dateidatum von DB überprüft. Tja, die Zeit stimmte. Neuer DB-Cache irgendwie aktiviert, oder was gibts noch was es nicht geben sollte ?? Also Sicherung vom Vortag überspielt : 5 Min. Dann habe ich den Source verglichen. Zeile für Zeile, ob da event. eine größere Gruppe von DB-Feldern aus Versehen weg war. Nichts ! Bis auf diese Stelle war der Source identisch :

Delphi-Quellcode:
readln (t,st);
//Memo1.Lines.Add (st);
// in DB wegschreiben
Lediglich das Memo war auskommentiert, aber das war ja wohl ziemlich egal. Denkste ! Die Anzeige mit dem Memo war alleine für den Effekt verantwortlich ! Sonst nichts. :wall: Das ist auch eindeutig reproduzierbar. Ich glaube nicht, daß irgendwer zwischen readln oder Stream einen Effekt beobachtn kann, der nur irgendwie in die Nähe solcher Zeitunterschiede kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 2 von 2     12   

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