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 nur eine zeile aus datei laden (https://www.delphipraxis.net/39423-nur-eine-zeile-aus-datei-laden.html)

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:16 Uhr.
Seite 2 von 2     12   

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