AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Aus Datei nur 2 Spalten einlesen?

Ein Thema von mat72 · begonnen am 9. Mai 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
mat72

Registriert seit: 15. Mär 2012
35 Beiträge
 
#1

Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 21:34
Delphi-Version: 7
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.
Angehängte Dateien
Dateityp: txt Kurve.txt (6,1 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.419 Beiträge
 
Delphi 5 Professional
 
#2

AW: Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 21:47
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 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

Geändert von Dalai ( 9. Mai 2012 um 21:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 21:54
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?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 22:40
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;
Angehängte Dateien
Dateityp: zip Beispiel Spalten lesen (Code).zip (5,4 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.409 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 23:23
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Mai 2012 um 23:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: Aus Datei nur 2 Spalten einlesen?

  Alt 9. Mai 2012, 23:33
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:
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf