![]() |
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* |
Re: nur eine zeile aus datei laden
AssignFile() Reset() ReadFile() CloseFile()
|
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: |
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? |
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
|
Re: nur eine zeile aus datei laden
Zitat:
MfG Binärbaum |
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; |
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: |
Re: nur eine zeile aus datei laden
wurde doch schon gesagt: Seek()
|
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 |
Re: nur eine zeile aus datei laden
Zitat:
Zitat:
|
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...
|
Re: nur eine zeile aus datei laden
Zitat:
@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 |
Re: nur eine zeile aus datei laden
stimmt, hab ich mit (un)typisierten dateien verwechselt
|
Re: nur eine zeile aus datei laden
Zitat:
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?? |
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:
Greetz
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; alcaeus PS: Getestet ist der Code (wie immer) nicht :!: |
Re: nur eine zeile aus datei laden
Zitat:
Bei Delphi for Win32 sollte es eigentlich keine solchen Einschränkungen geben :) mfG mirage228 |
Re: nur eine zeile aus datei laden
moin mirage, ne wie es aussieht geht Seek() mit "TextFile" nicht
|
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 |
Re: nur eine zeile aus datei laden
Zitat:
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