Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Aus Datei nur 2 Spalten einlesen? (https://www.delphipraxis.net/168209-aus-datei-nur-2-spalten-einlesen.html)

mat72 9. Mai 2012 21:34

Delphi-Version: 7

Aus Datei nur 2 Spalten einlesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich will aus einer Datei (Aufbau immer gleich) nur 2 Spalten einlesen.
Die Zahlen aus diesen Spalten benoetige ich fuer weitere Berechnungen.
Wie kann ich es anstellen, dass ich nur die 2 Spalten einlese?
In meinem Programm, lese ich die gesamte Datei ein.

Delphi-Quellcode:
unit Kurve;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, jpeg, ExtCtrls, Math, ExtDlgs;

type
  TForm9 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Button1: TButton;
    MainMenu1: TMainMenu;
    MainMenu2: TMenuItem;
    Exit1: TMenuItem;
    Help1: TMenuItem;
    Open1: TMenuItem;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    StaticText1: TStaticText;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form9: TForm9;
  filename : string;
implementation

{$R *.dfm}

procedure TForm9.Button1Click(Sender: TObject);
begin
close();
end;

procedure TForm9.Exit1Click(Sender: TObject);
begin
close();
end;

// liest Datei in Memofeld ein
procedure TForm9.Open1Click(Sender: TObject);
var S,helpstring : string;
    F : TextFile;

begin
if OpenDialog1.Execute then
  filename:= OpenDialog1.FileName;
  AssignFile(F, OpenDialog1.FileName); // Datei ausgewählen
  Reset(F);
  while not eof (F) do begin
  Readln(F, helpstring); //Erste Zeile der Datei lesen
  S:=S + helpstring;
  Memo1.Text := S; //String in ein Memo schreiben
  end;
  CloseFile(F);
end;

end.
Hier noch die Datei. Aus der Datei, brauche ich die Spalten Mx My.


Danke fuer eure Hilfe.

Dalai 9. Mai 2012 21:47

AW: Aus Datei nur 2 Spalten einlesen?
 
Nur so als Tip: Die Eigenschaft TMemo.Lines hat eine Methode LoadFromFile.

Ich würde das wohl mit Delimiter der Klasse TStringList (oder war's TStrings?) angehen. Im dümmsten Fall geht es immernoch, alle Strings der Liste mit einer Schleife durchzugehen und beim zweiten Leerzeichen (oder Tab) aufzuhören zu lesen.

Ergänzung:
Deine if-Bedingung in der Methode TForm9.Open1Click ist unvollständig, es fehlt ein
Delphi-Quellcode:
begin
nach dem OpenDialog1.Execute, was dazu führt, dass alle Anweisungen auch ausgeführt werden, wenn der Dialog abgebrochen wird. Die Variable filename ist, so wie sie da steht, überflüssig (deklariert, Wert zugewiesen, aber nie benutzt).

MfG Dalai

BUG 9. Mai 2012 21:54

AW: Aus Datei nur 2 Spalten einlesen?
 
Erste Frage: Warum? Die Datei ist klein die die gesuchten Werte liegen nah beieinander. Hier wird imho geschwindigkeitsmäßig nicht viel zu machen sein.
Zweiten Frage: Die Felder scheinen mit Leerzeichen immer gleich groß zu sein, ist das garantiert?

Popov 9. Mai 2012 22:40

AW: Aus Datei nur 2 Spalten einlesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Memo ist für sowas schlecht, denn Memo hat WordWrap. Also entweder da auf False setzten oder ListBox nehmen.

Wären die Ergebnisse nur mit Komma, Semikolon oder Tab getrennt, wäre es einfacher, aber bei dir ist es ein Mix. Ist aber auch nicht so wild:

Beispiel im Anhang!

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.WordWrap := False;
  Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Kurve.txt');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, p: Integer;
  ErsteZeile, SuchZeile: Integer;
  s, s1, s2: String;
begin
  //Erste brauchbare Zeile suchen
  ErsteZeile := Memo1.Lines.Count;
  for i := 0 to Memo1.Lines.Count - 1 do
    if SameText(Memo1.Lines[i], 'data1:') then
    begin
      ErsteZeile := i + 1;
      Break;
    end;

  //Suchzeichen aus Editfeld lesen
  SuchZeile := StrToIntDef(Edit1.Text, 1);
  Edit1.Text := IntToStr(SuchZeile); //Korrigieren wenn Fehler
  SuchZeile := ErsteZeile + SuchZeile;

  //Spalten extrahieren (für Beispiel immer nur eine Zeile)
  s := Memo1.Lines[SuchZeile];
  p := Pos(#9, s); // #9 = Tab
  Delete(s, 1, p); //löscht erstes Tab, d.h. bis vor erste Spalte

  p := Pos(#9, s); // #9 = Tab
  s1 := Copy(s, 1, p); //kopiert bis zweites Tab, d. h. erste Spalte
  Delete(s, 1, p); //löscht bis zweites Tab, d.h. bis vor zweite Spalte

  p := Pos(#9, s); // #9 = Tab
  s2 := Copy(s, 1, p); //kopiert bis drittes Tab, d. h. zweite Spalte
  //Delete(s, 1, p); //löscht bis drittes Tab, d.h. bis vor dritte Spalte

  Edit2.Text := Trim(s1);
  Edit3.Text := Trim(s2);
  //Fertig
end;

himitsu 9. Mai 2012 23:23

AW: Aus Datei nur 2 Spalten einlesen?
 
Neben Delphi-Referenz durchsuchenReadLn gibt es noch Delphi-Referenz durchsuchenRead und man muß auch nicht unbedingt beim ReadLn etwas auslesen, denn es ist auch ohne Zielvariable nutzbar.

Zitat:

Zweiten Frage: Die Felder scheinen mit Leerzeichen immer gleich groß zu sein, ist das garantiert?
Sieht eher nach Tabulator aus, zuzüglich ein paar füllender Leerteichen.
Am Tab auftrennen und dann mit Trim die Leerzeichen entfernen.

Pos, PosEx, Copy, Explode, die TStringList uvm.
Da gibt es Vieles, was man nutzen könnte.

BUG 9. Mai 2012 23:33

AW: Aus Datei nur 2 Spalten einlesen?
 
Zitat:

Zitat von himitsu (Beitrag 1165744)
Sieht eher nach Tabulator aus, zuzüglich ein paar füllender Leerteichen.

Eben, mit den Leerzeichen könnte man feste Offsets innerhalb der Zeile und eine feste Zeilenlänge haben.

Aber es scheint ja eher um das Zerlegen der Zeile zu gehen:
Zitat:

Zitat von himitsu (Beitrag 1165744)
Am Tab auftrennen und dann mit Trim die Leerzeichen entfernen.

Wäre auch meine Lösung der Wahl.

Mit den festen Anfängen könnte man die Werte auch einfach mit copy (oder manuell) herauskopieren, aber das Teilen an den Tabs ist wohl sicherer.


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