Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi nur eine zeile aus datei laden (https://www.delphipraxis.net/39423-nur-eine-zeile-aus-datei-laden.html)

Meflin 2. Feb 2005 14:09


nur eine zeile aus datei laden
 
Hi,
ich will eine zeile aus einer datei ermitteln. normalerweise würde ich dazu die datei in enie stringlist laden und halt einfach auf den index zugreifen. allerdings wäre es performancemäßig - da ich ja vorher schon weis welche zeile ich brauche - viel besser nur diese eine zeile zu laden. ich kann mir zwar nicht vorstellen, dass das geht, aber wissen kann man ja nie ;)
also ist das vielleicht doch irgendwie möglich?

*MFG*

Pseudemys Nelsoni 2. Feb 2005 14:11

Re: nur eine zeile aus datei laden
 
AssignFile() Reset() ReadFile() CloseFile()

Steve 2. Feb 2005 14:13

Re: nur eine zeile aus datei laden
 
Hi,

da gibts auch noch Seek() ReadLn() u.ä. Die ganzen nun genannten Suchbegriffe sollten Dir in der OH aber schon weiterhelfen ;)

Gruß
Stephan :dance:

Meflin 2. Feb 2005 14:40

Re: nur eine zeile aus datei laden
 
ok, nur
1. wird bei reset der inhalt der datei in den ram geladen?
2. check ich die readfile funktion nciht wirklich... könnte mir die wer erklären?

Pseudemys Nelsoni 2. Feb 2005 14:50

Re: nur eine zeile aus datei laden
 
Reset/Rewrite/Append öffnen die Datei mit den entsprechenden rechten... bzw reset öffnet die datei (sofern vorhanden) rewrite erstellt die datei bzw überschreibt sie falls vorhanden und append fuegt neue zeilen ans ende der datei

Binärbaum 2. Feb 2005 14:54

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von Meflin
wird bei reset der inhalt der datei in den ram geladen?

Nein, Reset öffnet die Datei (sofern nicht schon geöffnet= und setzt den dateiinternen Zeiger an den Dateianfang zum Lesen.

MfG
Binärbaum

Pseudemys Nelsoni 2. Feb 2005 14:56

Re: nur eine zeile aus datei laden
 
ich hab nochmal schnell ein grobes beispiel geschrieben.... mach einfach nen button und ein memo auf deine form, und erstell die datei "test.txt" in C:\...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  txt: TextFile;
  line: string;
begin
  if FileExists('C:\test.txt') then
  begin
    AssignFile(txt, 'C:\test.txt');
    Try
      Reset(txt);
      while not EOF(txt) do
      begin
        ReadLn(txt, line);
        Memo1.Lines.Add(line);
      end;
    finally
      CloseFile(txt);
    end;
  end;
end;

Meflin 2. Feb 2005 15:00

Re: nur eine zeile aus datei laden
 
jaja, soweit versteh ich des. nur wie komm ich an den inhalt einer einzelnen zeile, ohne die anderen auslesen zu müssen?
edit: oder auch nicht :gruebel: kann ich line mit der zeile gleichsetzen oder wie??
noch ein edit: ach ne :wall:

Pseudemys Nelsoni 2. Feb 2005 15:06

Re: nur eine zeile aus datei laden
 
wurde doch schon gesagt: Seek()

Binärbaum 2. Feb 2005 15:07

Re: nur eine zeile aus datei laden
 
Du kannst doch den selben Code wie oben nehmen, nur musst du die while-Schleife weglassen und nur einmal mit ReadLn() die erste Zeile auslesen.

MfG
Binärbaum

Meflin 2. Feb 2005 15:09

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von Pseudemys Nelsoni
wurde doch schon gesagt: Seek()

stweht in meiner hilfe
Zitat:

Not used with text files
ich habe aber ein textfile

Pseudemys Nelsoni 2. Feb 2005 15:14

Re: nur eine zeile aus datei laden
 
naja du benutzt delphi 2005... ka wie es da ist. in <=7 geht seek() mit allen dateien.... muss ja auch, schliesslich muss man den dateizeiger auch irgendwie bewegen koennen...

alcaeus 2. Feb 2005 15:16

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Pseudemys Nelsoni
wurde doch schon gesagt: Seek()

stweht in meiner hilfe
Zitat:

Not used with text files
ich habe aber ein textfile

Dann lies eben mit Readln solange Zeilen ein, bis du die richtige hast, oder ändere die Datei, so dass du nicht mehr mit einer Textdatei arbeiten musst.
@Pseudemys Nelsoni: Ne, Seek ging schon zu TP-Zeiten nicht mit Textfiles, frag mich aber nicht warum. Bei Textdateien (also F: Textfile) kann man nur von oben nach unten durchgehn, und dann mit Reset den Zeiger wieder an den Anfang stellen.

Greetz
alcaeus

Pseudemys Nelsoni 2. Feb 2005 15:21

Re: nur eine zeile aus datei laden
 
stimmt, hab ich mit (un)typisierten dateien verwechselt

Meflin 2. Feb 2005 15:30

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von alcaeus
Dann lies eben mit Readln solange Zeilen ein, bis du die richtige hast, oder ändere die Datei, so dass du nicht mehr mit einer Textdatei arbeiten musst.

datei ändern: etwas zu umständlich
also ich hab eine zahl x, und ich will die zeile x in der datei mit möglichst wenig resourcenverbrauch auslesen (da die datei sehr groß ist will ich sie nicht komplett laden). wenn ich jetzt aber die datei wieder von vorne zeile für zeile durchgehe, kann ich sie ja auch gliech ganz auf einmal in eine stringlist laden :gruebel: genau sowas will ich aber verhindern. oder versteh ich da jetzt was falsch??

alcaeus 2. Feb 2005 15:33

Re: nur eine zeile aus datei laden
 
Also, solange x kleiner ist als die Anzahl Zeilen in deiner Datei, ist das Auslesen einzelner Zeilen immer performanter als die gesamte Datei zu laden.

So könnte das Aussehen:

Delphi-Quellcode:
function GetLine(F: TextFile; LineNo: Integer): String;
var
  i: Integer;
  s: String;
begin
  i := 0;
  while (i <= LineNo) and not EoF(F) do
  begin
    Readln(F, s);
    Inc(i);
  end;
  Result := s;
end;
Greetz
alcaeus

PS: Getestet ist der Code (wie immer) nicht :!:

mirage228 2. Feb 2005 15:34

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Pseudemys Nelsoni
wurde doch schon gesagt: Seek()

stweht in meiner hilfe
Zitat:

Not used with text files
ich habe aber ein textfile

Bezieht sich die Meldung auf Delphi for Win32 oder Delphi for .NET :?:

Bei Delphi for Win32 sollte es eigentlich keine solchen Einschränkungen geben :)

mfG
mirage228

Pseudemys Nelsoni 2. Feb 2005 15:45

Re: nur eine zeile aus datei laden
 
moin mirage, ne wie es aussieht geht Seek() mit "TextFile" nicht

alcaeus 2. Feb 2005 15:55

Re: nur eine zeile aus datei laden
 
Hallo Leute,

da wird nicht dran gerüttelt: Seek funktioniert bei Textfiles (jedenfalls bis D7Ent) NICHT. Ich hätte es mir schon oft gewünscht, aber das Problem immer irgendwie umgehen müssen.
Dies hängt damit zusammen, da z.B. bei einem File of <Datentyp> alle Zeilen (also Einträge) eine fixe Größe haben, bei Textfiles aber nicht. Deshalb kann man bei einem File of <Datentyp> ganz einfach die Byteposition ausrechnen (Line*SizeOf(<DatenTyp>)), aber bei Textfiles geht das nicht. Und damit die Borland-Programmierer nicht eine Funktion schreiben, die die Zeilenumbrüche zählt, haben die gesagt dass Seek bei Textfiles nicht geht, und wir armen Schlucker müssen die Funktion eben selbst schreiben :mrgreen:

Greetz
alcaeus

shmia 2. Feb 2005 16:17

Re: nur eine zeile aus datei laden
 
Zitat:

Zitat von Meflin
ich will eine zeile aus einer datei ermitteln. normalerweise würde ich dazu die datei in enie stringlist laden und halt einfach auf den index zugreifen. allerdings wäre es performancemäßig - da ich ja vorher schon weis welche zeile ich brauche - viel besser nur diese eine zeile zu laden. ich kann mir zwar nicht vorstellen, dass das geht, aber wissen kann man ja nie ;)

Du kannst dich nicht Duschen ohne dich nass zu machen!

Also wenn du keine Information darüber hast, wo in der Datei sich die gesuchte Zeile befindet,
dann hilft es nichts: die komplette Datei muss gelesen werden.

Du musst aller aber nicht die ganze Datei am Stück in den Speicher laden;
es reicht aus, die Datei in Blöcken von 8kb bis 256kb zu laden und dort nach den gesuchten Daten zu fanden.
Das Lesen von einzelnen Zeilen mitteln ReadLn ist im Hintergrund gepuffert aber ein Dateizugriff
mit TFileStream oder mit Windows-API ReadFile dürfte noch schneller sein.


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