AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textdatei zerlegen

Ein Thema von rowkajjh · begonnen am 9. Apr 2006 · letzter Beitrag vom 9. Apr 2006
Antwort Antwort
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#1

Textdatei zerlegen

  Alt 9. Apr 2006, 17:32
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 17:51
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
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 18:03
Ü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
  Mit Zitat antworten Zitat
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#4

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 18:19
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?
  Mit Zitat antworten Zitat
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#5

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 18:28
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
---------------------------
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 18:32
Es fehlt das Reset( f); nach AssignFile
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Textdatei zerlegen

  Alt 9. Apr 2006, 18:32
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
  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 17:57 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