AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

Ein Thema von Konstantin H. · begonnen am 28. Apr 2014 · letzter Beitrag vom 28. Apr 2014
Antwort Antwort
Benutzerbild von Konstantin H.
Konstantin H.

Registriert seit: 3. Nov 2008
Ort: Schwedt/Oder
27 Beiträge
 
Delphi 2006 Professional
 
#1

Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 14:01
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:
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;
MfG Konstantin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 14:14
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 SL[i] := Copy(SL[i], x {, Length(SL[i])}); den Anfang entfernen
- [edit] seh grade noch das until z = 40; ... unnötige Zeilen kann man hier auch noch rauslöschen. (while SL.Count > 40 do SL.Delete(40); )
- und dann txt_eingabe.Text := SL.Text;




PS:
Zitat:
else
danach fehlt Begin und End
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 Delphi-Referenz durchsuchenFileExistsPrüfung, da beim Laden/Öffnen der Datei sowieso eine Fehlermeldung kommt.



Wird der Dialog nur hierfür verwendet?
Dann brauchst du OpenDialog1.Filter und Co. nicht im Code zu setzen, sondern mach das einfach schon im OI.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Apr 2014 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Konstantin H.
Konstantin H.

Registriert seit: 3. Nov 2008
Ort: Schwedt/Oder
27 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 14:29
@himitsu

Danke für die schnelle Antwort, muss erstma sacken lassen und anwenden, melde mich wenn ich was habe.

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:
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;
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.

MfG Konstantin

Geändert von Konstantin H. (28. Apr 2014 um 15:01 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 15:20
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 15:28
Und das eine "end;" kommt zu früh, die Datei soll ja nur gelesen werden, wenn es sie auch gibt.
Delphi-Quellcode:
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;
Ein Ressourcenschutzblock (try-finally) wäre ggf. nicht schlecht, ich hab den aber auch mal weggelassen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 15:55
Jetzt haste aber auch den Dateinamen vergessen:
If not FileExists(OpenDialog1.FileName) then
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Konstantin H.
Konstantin H.

Registriert seit: 3. Nov 2008
Ort: Schwedt/Oder
27 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 16:06
Danke für die viele Vorschläge,

zuerst @DeddyH. Die Variante ist super, jedoch gibt es ein Problem mit FileExists
Delphi-Quellcode:
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;
Bei dieser Variante, meint der Compiler, dass die Zeile If not FileExists then nicht genügend Parameter hat. Auch mit FileExists = true...

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:
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.
Hast du eine Ahnung woran das liegen könnte?
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 16:19
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.
Ralph

Geändert von Jumpy (28. Apr 2014 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Konstantin H.
Konstantin H.

Registriert seit: 3. Nov 2008
Ort: Schwedt/Oder
27 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 16:53
Jumpy, DaddyH und himitsu, Vielen Dank! Damit wäre das Problem gelöst.Ich nehme wohl die schlankere Variante
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Zeile aus einer Textdatei ab einem bestimmten Zeichen auslesen

  Alt 28. Apr 2014, 17:18
Jetzt haste aber auch den Dateinamen vergessen:
If not FileExists(OpenDialog1.FileName) then
Japp, beim C&P nicht drauf geachtet
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz