Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeilenweises Lesen einer TXT-Datei? (https://www.delphipraxis.net/31847-zeilenweises-lesen-einer-txt-datei.html)

HaCkAttaCk2001 14. Okt 2004 18:34


Zeilenweises Lesen einer TXT-Datei?
 
Hi @ all.

Also Fakt ist das ich nicht viel über FileStreams weiß und ich das hier einfach nicht hinbekomme...

Ich möchte eine stinknormale TXT-Datei in das Programm einlesen. Dann soll jede einzelne Zeile in eine eigene Zeile einer CheckListBox eingefügt werden. Die Zeilenumbrüche sind selbstverständlich immer ein normales Enter.

Edit: Im konkreten Fall habe ich z.b. eine Datei Namens URLs.txt . In der stehen drei Adressen durch Enter separiert:

http://www.blabla.de/text1.txt
http://www.blabla.de/text1.txt
http://www.blabla.de/text1.txt

Und diese Zeilen sollen jeweils eine Zeile in einer CheckListBox belegen.

Wie realisiere ich das?



C ya.

Gruber_Hans_12345 14. Okt 2004 18:37

Re: Zeilenweises Lesen einer TXT-Datei?
 
Delphi-Quellcode:
ChecklistBox1.Items.LoadFromFile('c:\meintextfile.txt');

HaCkAttaCk2001 14. Okt 2004 18:43

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Es gibt da schon sowas? *omg* und ich verbrenn mir hier die grauen Zellen ^^ .


THX ich teste 's gleich mal :D .


C ya.

HaCkAttaCk2001 14. Okt 2004 18:54

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Es funktioniert ja soweit... das Problem ist nur, dass das was vorher in der CheckListBox stand, verschwindet. Ich glaub stattdessen müsste man da irgendwas mit Insert nehmen. Nur genau dafür gibts wieder keine "Vereinfachung" :-/ .


C ya.

_Sebastian_ 14. Okt 2004 19:07

Re: Zeilenweises Lesen einer TXT-Datei?
 
guck dir mal Hier im Forum suchenAssignfile und Hier im Forum suchenReadln an.
Dannn kannste die datei zeilenweise auslesen und unten an die listbox anhängen.
Listbox.Items.add müsste das sein.

HaCkAttaCk2001 15. Okt 2004 17:15

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Ich hab nun ein wenig Code aus der DP und aus der Delphihilfe benutzt, kombiniert und angepasst, aber anstatt mir jede Zeile in einer eigenen Zeile in der CheckBoxList auszugeben, gibt er mir nur die erste Zeile so oft aus, wie das Dokument Zeilen hat :?:

Ich hab folgenden Code für das Einlesen vorliegen:

Delphi-Quellcode:
    AssignFile(F, OpenDialog1.Files[i]);
  {$I-}
    Reset(F);
  {$I+}
    if IOResult = 0 then
    begin
      while not EOF(F) do
      begin
        ReadLn(F, s1);
        s := s + s1;
        CheckListBox1.Items.Add(s);
      end;
      CloseFile(F);
    end;
Irgendwie verstehe ich auch warum nur die erste Zeile kommt... woher soll Delphi wissen welche Zeile er nun auslesen soll? Aber irgendwie weiß ich nicht wie ich das vermitteln soll :-| .


C ya.

Nikolas 15. Okt 2004 17:20

Re: Zeilenweises Lesen einer TXT-Datei?
 
Delphi-Quellcode:
while not EOF(F) do
      begin
        ReadLn(F, s1);
       (1) s := s + s1; // Lass die Zeile mal weg
        CheckListBox1.Items.Add(s); // und schreib hier (sl), dann sollte es laufen.
      end;
in (1) hängst du die neue Zeile an die letzten dran und gibt's nachher alle Zeilen. Das müsste eigentlich so aussehen:
// Testdatei:
a
b
c

// Deine Ausgabe:
a
a
b

a
b
c

.

Wie sind denn s und sl deklariert und initialisiert? Vielleicht läuft da was schief.

Gruber_Hans_12345 15. Okt 2004 17:21

Re: Zeilenweises Lesen einer TXT-Datei?
 
Ich glaub müßte eher so funktionieren ...

Delphi-Quellcode:
    AssignFile(F, OpenDialog1.Files[i]);
  {$I-}
    Reset(F);
  {$I+}
    if IOResult = 0 then
    begin
      while not EOF(F) do
      begin
        ReadLn(F, s1);
        CheckListBox1.Items.Add(sl);
      end;
      CloseFile(F);
    end;
aber ich würde es eher mit einer weiteren Stringliste machen, das mit AssignFile kommt mir persönlich schon etwas zu alt vor (kommt ja noch von der DOS Zeit ...) aber ...


Delphi-Quellcode:
var tempSL     : TStringList;
begin
    tempSL     := TStringList.Create;
    tempSL.LoadFromFile(FileName);
    CheckListBox1.AddStrings(tempSL);
    tempSL.Free;

HaCkAttaCk2001 15. Okt 2004 17:29

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Erstmal danke an euch beide. CheckListBox1.Items.Add(sl); funktioniert :D . Irgendwie hab ich das selber nicht gesehen...

Und zu den Stringlisten... damit hab ich mich noch weniger beschäftigt als mit FileStreams ^^ . Ich glaub ich mach das erstmal mit AssignFile.

Obwohl, welche von beiden Methoden ist wohl die schnellere? Assignfile oder StringList? Da das was ich derzeit schreibe so schnell wie möglich funktionieren sollte, wäre es mir recht wenn es 'nen Geschwindigkeitsvorteil gäbe.


C ya.

Gruber_Hans_12345 15. Okt 2004 17:41

Re: Zeilenweises Lesen einer TXT-Datei?
 
Zitat:

Zitat von HaCkAttaCk2001
Hi.

Erstmal danke an euch beide. CheckListBox1.Items.Add(sl); funktioniert :D . Irgendwie hab ich das selber nicht gesehen...

Und zu den Stringlisten... damit hab ich mich noch weniger beschäftigt als mit FileStreams ^^ . Ich glaub ich mach das erstmal mit AssignFile.

Obwohl, welche von beiden Methoden ist wohl die schnellere? Assignfile oder StringList? Da das was ich derzeit schreibe so schnell wie möglich funktionieren sollte, wäre es mir recht wenn es 'nen Geschwindigkeitsvorteil gäbe.


C ya.

Was heißt so schnell wie Möglich ?!?

Wieviele Zeilen liest du ein (wieviel MB hat die Datei, die du einliest ?)

wenn du da um die 100 Zeilen einliest, und nur einmal, dann würde ich nicht schauen, das du den schnellsten Code verwendest, sondern den, der am besten zu lesen / am besten wiederverwendbar ist.

Ansonsten wenn du wirklich geschwindigkeitsvorteil haben möchtest, dann würde ich einen TFileStream machen.

HaCkAttaCk2001 15. Okt 2004 17:45

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Die Größe der Dateien sind verschieden. Aber es kann durchaus mal vorkommen, dass die Datei über 10000 Einträge hat. Also ist FileStream schneller? Hm, ok werd ich mich mal damit befassen *delphi-hilfe-zück*.


C ya.

ste_ett 15. Okt 2004 17:46

Re: Zeilenweises Lesen einer TXT-Datei?
 
Zitat:

Irgendwie verstehe ich auch warum nur die erste Zeile kommt... woher soll Delphi wissen welche Zeile er nun auslesen soll? Aber irgendwie weiß ich nicht wie ich das vermitteln soll Neutral .

Ganz einfach. :)

Reset(TextFile)
setzt den Zeiger für diese Datei an den Anfang der Datei.

Readln(TextFile,String)
ließt bis zum Zeilenende, und setzt den Zeiger auf den Anfang der nächsten Zeile.

HaCkAttaCk2001 15. Okt 2004 18:31

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

Habs mal mit GetTickCount ausgemessen und das mit der StringList geht tatsächlich schneller, weil weniger Schleifen etc. benötigt werden. Zudem ist der Code damit auch wesentlich kleiner ;) .


THX! :dp: :D .


C ya.

Nikolas 15. Okt 2004 18:34

Re: Zeilenweises Lesen einer TXT-Datei?
 
Wie groß war den der Unterschied? Gettickcount ist nicht gerade genau!

Gruber_Hans_12345 15. Okt 2004 18:37

Re: Zeilenweises Lesen einer TXT-Datei?
 
noch mal so zur info, was liest du für Daten ein ?
werden die Daten von dir erzeugt (aus einem deiner Programme erzeugt ?)

Ganz so vergleichen kannst du die zeiten nicht !

da müßtest du bei der AssignFile variante :

Delphi-Quellcode:
CheckListBox.Items.BeginUpdate;
// hier der restliche code
ChecklistBox.Items.EndUpdate;
dann hast du reele Zeiten !

HaCkAttaCk2001 15. Okt 2004 19:01

Re: Zeilenweises Lesen einer TXT-Datei?
 
Hi.

GetTickCount ist ungenau?! Aber was sollte ich denn da nehmen? Das war das einzig mir bekannte um sowas zu messen :-| .

Wenn ich's mir recht überlege, könnte ich gleich was einbauen das einzeigt, wie lange es gedauert hat, die Liste(n) zu laden... nur was soll ich eurer Meinung nach nehmen?

Edit: Ach ja, die Daten sind entweder URLs oder lokale Dateien. Jede in einer eigenen Zeile. Die hat der User vorher schon irgendwie erstellt.


C ya.

Gruber_Hans_12345 15. Okt 2004 19:07

Re: Zeilenweises Lesen einer TXT-Datei?
 
GetTickCount ist auf 18 ms genau (oder war es einmal) dh. wenn der unterschied unter 10 ms ist, dann kannst nicht genau sagen wer um wieviel schneller ist.
Besser / Genauer wäre QueryPerformanceCounter und QueryPerformanceFrequency

Dano 26. Okt 2004 19:56

Re: Zeilenweises Lesen einer TXT-Datei?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Frequenz,Time1,Time2: Int64;
begin
  QueryPerformanceFrequency(Frequenz);         // zeitmessung
  QueryPerformanceCounter(Time1);              // zeitmessung

  !!! zu messende funktion hier !!!

  QueryPerformanceCounter(Time2);              // zeitmessung

  //1. ausgabe in millisekunden
  Form1.Label1.Caption:=FormatDateTime('hh:nn:ss:zzz',IncMilliSecond(0,Round( (Time2-Time1)/Frequenz*1000 ))); // zeitmessung

  //2. oder in tick's
  Form1.Label1.Caption:=FloatToStrF(Time2-Time1,ffNumber,99,0); // zeitmessung

end;
das ganze kann durch das multitasking aber etwas abweichen...
geht glaube erst ab NT,2000,XP
und windows muß in uses sein...

mfg Dano


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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