PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bestimmte zeilen aus .txt auslesen


freak182
15.05.2002, 10:28
also das eine was ich unter dem thema turbo pascal geschrieben hab hat sich erledigt.
jetzt hab ich ein neues prob.:

ich habe eine externe .txt datei mit vielen zeilen aus der bestimmte zeilen (z.b.: die zeilen 6-13 von 40 zeilen) ausgelesen werden sollen.
frage:
wie schreibe ich das jetzt in meinen code das ich nur die bestimmten zeilen auslese???

mein jetztiger code zum testen...:


var daten:text;
zeile:string;

procedure ausgeben;
begin
writeln(zeile);
end;

begin
assingn(daten,´c:...pfad....txt´);
reset(daten);
while not EoF(daten) do
begin
readln(daten,zeile);
ausgeben
end;
close(daten);
repeat until keypressed;
end.


vielleicht hab ich meine frage ja diesmal klar und deutlich gestellt ;)

mfg,
timoK.


Felix Kaiser
15.05.2002, 14:04
Jep, haste ;)


procedure GotoLine(var t: text; line: integer);
var
n: integer;
s: string;
begin
Seek(t,0);
n:= line;
repeat
dec(line);
if line > 0 then Readln(t,s);
until Eof(t) or (n = 0);
end;


Mit dieser Routine könntest du zu einer bestimmten Zeile springen. Um z.B. 5 Zeilen ab Zeile 6 zu lesen, mach einfach:


var
lines: array[1..5] of string;
i: integer;
t: text;
begin
Assign(t,´meinedatei.txt´);
Reset(t);
GotoLine(t,6);
for i:= 1 to 5 do Readln(t,lines[i]);
Close(t);
end;


Alles klar? :)

freak182
15.05.2002, 14:58
jo, danke erstmal. ich probiere es gleich aus.
wenns nicht klappt meld ich mich wieder, sonst werd ich mich eh mit nem neuem prob. bald wieder melden ;)
so long...

timoK.

Diogenes
15.05.2002, 18:36
Das wird nicht funktionieren: Seek geht nur bei typisierten Dateien (type file of Irgend)

Mühsames Auslesen jeder Zeile von Anfang an. Das heißt, jedesmal mitzählen, wieviele Zeilen schon gelesen sind.

Es gäbe noch die Möglichkeit, das Textfile als file of Char oder File of Byte zu eröffnen und direkt ab der Stelle zu lesen, an der die gewünschten Zeilen beginnen. (Hier geht das Seek durchaus.) Dazu müßte man die Beginne und Längen der Zeilen kennen. Erstellung eines Map-Files ist dann empfohlen, wenn man dieses File öter braucht und es sich nicht oft ändert.

Wenn sich allerdings dein Problem auf Dateien wie in http://www.coding-board.de/board/thread.php?threadid=115&boardid=13&styleid=1 bezieht, dann ist es doch am besten, wenn Du das als typisierte Datei machst:
type
TCompound=record
Name: string;
Nummer: string[ 20]
end;

var
TelBuch: file of TCompund;
TelBuf: TCompound;


Öffnen, Schließen, Reset , Rewrite geht wie bei einer Text-Datei.

Lesen mit Read (Datei, TelBuf) und Schreiben mit Write( Datei, TelBuf).

Das Runtime-Modul führt einen Zeiger mit, der mit 0 am Dateianfang beginnt und nach jedem Zugriff mit Read oder Write inkrementiert wird.
Künstlich verstellen läßt er sich mit Seek( Datei, Zielindex). Wenn Zielindex über das Dateiende hinauszeigt, wird die Datei erweitert (jedenfalls beim Schreiben)!

Felix Kaiser
15.05.2002, 20:20
Bei Seek spielt der Dateityp afaik keine Rolle. Bezogen auf die DOS API hat man IMMER ein Filehandle und anhand diesem wird halt gesucht. In der DOS API spielts also keine Rolle, bei Delphi auch nicht, wüsste nich warum bei Pascal nicht? Zumal glaube das bei mir immer ging.

Diogenes
20.05.2002, 11:33
@Guru:

Stimmt, das DOS hat immer "das selbe" File-Handle, nur wird das vom RTM (in der System-Unit) unterschiedlich verwendet:

Untypisierte Dateien Typ file haben unstrukturierte Datensatzlängen, die selbst allerdings fix sind. Ich habe es nie ausprobiert, aber hier könnte Seek funktionieren, weil es eine fixe Daternsatzlänge braucht.
Typisierte Dateien sind hoffentlich klar.
Textfiles sind essentiell file of Char die speziell behandelt werden (müssen), weil sie keine fixe Datensatzlänge haben. Daher kann Seek nicht gehen: das findet den Anfang des gesuchten Satzes nach Index * SizeOf( Buffer)

freak182
22.05.2002, 09:42
ok, danke.
ihr habt mir schon geholfen, aber ich werde wohl lieber erstmal weiter vorne im buch weiter machen. ich merke das ich mit der ein oder anderen anweisung noch so meine probs hab. :mauer:
aber trozdem danke.

mfg,
timoK.