Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei zerlegen (https://www.delphipraxis.net/67099-textdatei-zerlegen.html)

rowkajjh 9. Apr 2006 16:32


Textdatei zerlegen
 
Hallo,

ich habe eine Textdatei, in welcher jeweils in einer Zeile Punktnummer, x und y stehen. So etwas:

1 12,9 7,6
2 9,3 8,2
1235 5123,6 545671,0

Wie kann ich denn mit Pascal die Datei einlesen und jeweils die Punktnummer, x und y zu bekommen? Sowas wie scanf bei C.

Danke!

mkinzler 9. Apr 2006 16:51

Re: Textdatei zerlegen
 
Anhand des Trennzeichens zerlegen. Möglich mit Hilfe von pos/posex(1), StrScan(2), oder StringList(3)

(1) Postion des 1 Trennzeichens mit Pos() ermittlen und des Zweitens mit Fundstelle1 + 1 als Startindex.
(2) Strscan liefert nicht Position der Fundstelle sonder Zeiger auf Fundstelle.
(3) .Delimiter auf trennzeichen und Zeile als .DelimitedTest zerlegt dir den string in Teilstrings

marabu 9. Apr 2006 17:03

Re: Textdatei zerlegen
 
Übrigens: alle Pascal-Dialekte - auch Delphi - verarbeiten Zahlen im nativen Format (Dezimalpunkt, nicht Komma) sehr effektiv:

Delphi-Quellcode:
{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i: Integer;
  x, y: Extended;

begin
  DecimalSeparator := '.'; // adjust output
  while not Eof do
  begin
    ReadLn(i, x, y);
    WriteLn(Format('%d %.1f %.1f', [i, x, y]));
  end;
end.
Grüße vom marabu

rowkajjh 9. Apr 2006 17:19

Re: Textdatei zerlegen
 
Hmmm, bei eof bekomme ich eine Exception:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt DAT2DTEST.exe ist eine Exception der Klasse EInOutError mit der Meldung 'E/A-Fehler 104' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


Delphi-Quellcode:
Procedure DAT2D.LoadFromFile(filename : string);
var
  i  : Integer;
  x, y: Extended;
  F  : TextFile;
begin
  DecimalSeparator := ','; // adjust output
  AssignFile(F, filename);
  while not Eof(F) do
  begin
    ReadLn(F, i, x, y);
    AddOrReplace(x,y,i);
  end;
end;
Muß ich noch Assignfile noch was machen mit der Datei?

rowkajjh 9. Apr 2006 17:28

Re: Textdatei zerlegen
 
Ich habe jetzt jinter den AssignFile eine Rest eingefügt, jetzt bekomme ich aber bei
ReadLn(F, i, x, y); eine

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt DAT2DTEST.exe ist eine Exception der Klasse EInOutError mit der Meldung 'Ungültige numerische Eingabe' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

mkinzler 9. Apr 2006 17:32

Re: Textdatei zerlegen
 
Es fehlt das
Delphi-Quellcode:
Reset( f);
nach AssignFile

marabu 9. Apr 2006 17:32

Re: Textdatei zerlegen
 
Beachte bitte, dass mein Code-Beispiel eine minimale Konsolenanwendung war. In einer GUI-Anwendung musst du tatsächlich AssignFile() und natürlich anschließend Reset() und CloseFile() benutzen:

Delphi-Quellcode:
Procedure DAT2D.LoadFromFile(filename : string);
var
  i  : Integer;
  x, y: Extended;
  F  : TextFile;
begin
  DecimalSeparator := '.'; // adjust output
  AssignFile(F, filename);
  Reset(F);
  while not Eof(F) do
  begin
    ReadLn(F, i, x, y);
    AddOrReplace(x, y, i);
  end;
  CloseFile(F);
end;
Zur Erinnerung: das funktioniert nur, wenn deine Daten einen Dezimalpunkt verwenden! Grund dafür ist, dass die Standard-I/O-Routinen den Punkt fest eingebaut haben - Standard halt.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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