![]() |
Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Hallo,
ich habe, zum ersten mal seit Jahren, mich wieder mit Delphi beschäftigt. Ich möchte aus einer Textdatei Information auslesen und in die Memo packen. Dabei ist es wichtig, dass jede Zeile nicht gleich ab Anfang ausgelesen wird sondern ab den x-ten zeichen. Es spielt keine Rolle, welcher Zeichen das ist, sondern nur die nummerierung. Ich bin soweit, dass ich eine bestimmte Anzahl der Zeilen auslesen kann und in ein Memo packen kann. Bleibt nur das Einlesen ab nen Bestimmten Punkt.In der repeat-Schleife muss bei readln noch eine Bedienung rein, ich weiß aber nicht welche. Habe schon ziemlich viel durchgeguckt und keine Hilfe gefunden. Vielen Dank im Vorraus. :) Ich arbeite mit Delphi 2006.
Delphi-Quellcode:
MfG Konstantin
procedure TForm1.meldung_einClick(Sender: TObject);
var z: integer; //Laufvariable s: string; datei: TextFile; begin OpenDialog1.Filter := 'text files(*.txt)|*.txt;';//Nur .txt-Dateien anzeigen OpenDialog1.FilterIndex := 1; If OpenDialog1.Execute then If OpenDialog1.FileName = '' then MessageDlg('Keine Datei Ausgewählt!', mtWarning, [mbOK], 0) else AssignFile(datei, OpenDialog1.FileName);//Vorbereitung zur Auslesung reset(datei); z := 0; txt_eingabe.clear; repeat //benötigte Zeilen auslesen inc(z); readln(datei, s); txt_eingabe.Lines.Add(s); until z = 40; CloseFile(datei); end; |
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Du kannst zwischen ReadLn und Lines.Add via Delete die ersten Zeichen aus deinem S entfernen oder via Copy die gewünschten Zeichen aus S rauskopieren.
Oder TStrinList: - die ganze Datei einlesen - via For-Schleife über die Zeilen laufen und via
Delphi-Quellcode:
den Anfang entfernen
SL[i] := Copy(SL[i], x {, Length(SL[i])});
- [edit] seh grade noch das
Delphi-Quellcode:
... unnötige Zeilen kann man hier auch noch rauslöschen. (
until z = 40;
Delphi-Quellcode:
)
while SL.Count > 40 do SL.Delete(40);
- und dann
Delphi-Quellcode:
txt_eingabe.Text := SL.Text;
PS: Zitat:
Aber das ist eh nutzlos, da der OpenDialog immer einen (oder mehrere) Dateinamen liefert. Du kannst eventuell aber in den Dialog-Optionen die Prüfung auf "Datei existiert" aktivieren. Denn standardmäßig kann man auch einen nicht-vorhandenen Dateinamen angeben, aber auch kann man sich die manuell ![]() Wird der Dialog nur hierfür verwendet? Dann brauchst du
Delphi-Quellcode:
und Co. nicht im Code zu setzen, sondern mach das einfach schon im OI.
OpenDialog1.Filter
|
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
@himitsu
Danke für die schnelle Antwort, muss erstma sacken lassen und anwenden, melde mich wenn ich was habe.:thumb: EDIT: Also die Dateikriterien habe ich im Menü geändert. Sowohl den Filter als auch FileMustExist. Mein System erkennt die Funktion "System.SysUtils.FileExists" Funktion nicht: SysUtils is not a member of System. Das Untere bsp funktioniert nicht.
Delphi-Quellcode:
Wenn keine Datei ausgewählt wurde und ich den Öffnungsdialog schließe, bekomme ich jetzt die Meldung "I/O error 104". Kommt wohl aus dem readln, versuche jetzt erstmal dein Lösungsansatz mit TStringList.
procedure TForm1.meldung_einClick(Sender: TObject);
var z: integer; //Laufvariable s: string; datei: TextFile; begin If OpenDialog1.Execute then If System.SysUtils.FileExists = false then MessageDlg('Keine Datei Ausgewählt!', mtWarning, [mbOK], 0) else begin AssignFile(datei, OpenDialog1.FileName);//Vorbereitung zur Auslesung reset(datei); z := 0; txt_eingabe.clear; end; repeat //benötigte Zeilen auslesen inc(z); readln(datei, s); txt_eingabe.Lines.Add(s); until z = 40; CloseFile(datei); end; MfG Konstantin |
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Welches Delphi hast du denn? ggF. System weglassen, oder direkt oben in der Uses Sysutils einbinden, dann reicht FileExists zu schreiben, wobei du in deinem Besipiel dieser aber schon einen Dateinamen übergeben solltest.
|
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Und das eine "end;" kommt zu früh, die Datei soll ja nur gelesen werden, wenn es sie auch gibt.
Delphi-Quellcode:
Ein Ressourcenschutzblock (try-finally) wäre ggf. nicht schlecht, ich hab den aber auch mal weggelassen.
procedure TForm1.meldung_einClick(Sender: TObject);
var z: integer; //Laufvariable s: string; datei: TextFile; Position: integer; //Position, ab der die einzelnen Zeilen kopiert werden sollen begin Position := 5; If OpenDialog1.Execute then If not FileExists then MessageDlg('Keine Datei Ausgewählt!', mtWarning, [mbOK], 0) else begin AssignFile(datei, OpenDialog1.FileName);//Vorbereitung zur Auslesung reset(datei); z := 0; txt_eingabe.clear; repeat //benötigte Zeilen auslesen inc(z); readln(datei, s); txt_eingabe.Lines.Add(Copy(s, Position)); until z = 40; CloseFile(datei); end; //erst hier ist der Block zu Ende end; |
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Jetzt haste aber auch den Dateinamen vergessen:
Delphi-Quellcode:
If not FileExists(OpenDialog1.FileName) then
|
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Danke für die viele Vorschläge,
zuerst @DeddyH. Die Variante ist super, jedoch gibt es ein Problem mit FileExists
Delphi-Quellcode:
Bei dieser Variante, meint der Compiler, dass die Zeile
var z: integer; //Laufvariable
s: string; datei: TextFile; p: integer; begin p := 11; If OpenDialog1.Execute then If not FileExists then MessageDlg('Keine Datei Ausgewählt!', mtWarning, [mbOK], 0) else begin AssignFile(datei, OpenDialog1.FileName);//Vorbereitung zur Auslesung reset(datei); z := 0; txt_eingabe.clear; repeat //benötigte Zeilen auslesen inc(z); readln(datei, s); txt_eingabe.Lines.Add(Copy (s, p)); until z = 40; CloseFile(datei); end; end;
Delphi-Quellcode:
nicht genügend Parameter hat. Auch mit FileExists = true...
If not FileExists then
EDIT: Alles klar, danke Jumpy! @himitsu Das habe ich mit deinem Denkanstoss angestellt, da kommt ein fehler in der for-schleife "list out of bounds"
Delphi-Quellcode:
Hast du eine Ahnung woran das liegen könnte?
var SL: TStringList;
z: integer; begin SL := TStringList.Create; try OpenDialog1.Execute; SL.LoadFromFile(OpenDialog1.FileName); for z := SL.Count -1 downto 0 do begin while SL.Count > 40 do SL.Delete(SL.Count); SL[z] := Copy(SL[z], 11, Length(SL[z])); end; txt_eingabe.Text := SL.Text; finally SL.Free; end; end. |
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Angenommen deine Datei hat 60 zeilen. Dann ist z im ersten durchlauf 59.
Dann gehst du hin und löschst Zeilen 40-59. Dann willste auf Zeile 59 die nicht mehr da ist zugreifen.
Delphi-Quellcode:
var SL: TStringList;
z: integer; begin SL := TStringList.Create; try if not OpenDialog1.Execute then exit; SL.LoadFromFile(OpenDialog1.FileName); while SL.Count > 40 do SL.Delete(SL.Count-1); for z := 0 to SL.Count-1 do SL[z] := Copy(SL[z], 11, Length(SL[z])); txt_eingabe.Text := SL.Text; finally SL.Free; end; end. |
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Jumpy, DaddyH und himitsu, Vielen Dank!:thumb: Damit wäre das Problem gelöst.Ich nehme wohl die schlankere Variante :stupid:
|
AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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 by Thomas Breitkreuz