Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei auswerten (https://www.delphipraxis.net/29430-datei-auswerten.html)

motu 9. Sep 2004 07:35


Datei auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

zuersteinmal muss ich vorwarnen, das es durchaus möglich ist, das ich das gewünschte Porgramm komplett hier entwickeln lasse, da meine bisherigen Kenntnisse kaum ausreichen werden. Ich habe eine Datei, die ausgewertet werden soll. alle Werte darin sind Tab-getrennt abspeichert. Nun soll diese Datei geöffnet werden (das bekomm ich wohl noch hin). Das Delphi das E-Format der Zahlen versteht kann ich auch schon sagen. Nun wird aber haarig. Die Spalten mit den Überschiftn MFG1.POWER, MFG1.POWERA, MFG1.POWERB müssen darauf überprüft werden, ob in allen drei Spalten die Werte über zehn liegen, hinzu kommt, das dazu auch überprüft wird in wievielen zusammenhängenden Zeilen dem so ist. Wenn die Zeilen bekannt sind, soll in allen Spalten in den betreffenden Zeilen die Standardabweichung und der Mittelwert berechnet werden.
Zusätzlich wär es schön. wenn die Ergebnisse in einer neuen Datei gespeichert werdem, das muß aber nicht.
Eigentlich sollte diese Auswertung kein Problem sein, aber ich hab keine Ahnung.

Könnt Ihr mir da helfen?

Danke
motu

mumu 9. Sep 2004 08:45

Re: Datei auswerten
 
ich würde alle zeilen, außer die überschriften in ein array laden und dann anschließend für jedes gewünschte ergenis ne funktion schreiben... ist eigentlich easy. wo ist genau dein problem?

motu 9. Sep 2004 08:49

Re: Datei auswerten
 
Zitat:

Zitat von mumu
wo ist genau dein problem?

Problem? Probleme wär besser.

Es fängt schon damit an, das ich erstmal rausfinden muss, wie ich das alles in ein Array bekomme, dann wie ich das ganze Parse und dann wie ich aus MeanAndStdDev die einzelnen Ergebnisse bekomme. Ich beschäftige mich erst seit kurzem mit Delphi und bisher bin ich gut mit meinen Kenntnisse in den Bereichen: Form zusammenklicken, Objektinspektor nutzen, Eigenschaften oder Werte zuweisen zurecht gekommen - soweit zu meinem Kenntnissstand.

Danke schonmal an alle die helfen möchten



[edit] da warick wohl zu hecktisch an de Tastatur [/edit]

motu 9. Sep 2004 09:02

Re: Datei auswerten
 
Icg brauch' einen dynamischen Array, in Größe der Datei aber wie bekomm' ich die Zeilen- und Spaltenanzahl aus meiner Datei?

Jelly 9. Sep 2004 09:13

Re: Datei auswerten
 
Hi,

ich würde das ganze in Excel importieren, dann hast du schon mal alles schön sauber in Spalten und Zeilen. Von Delphi aus würde ich dann per ADO auf die Excel-Datei zugreifen, und mir die Bedingungen, die du angegeben hast, in eine entsprechende SQL Anweisung formen, und schon hast du dein Ergebis als Recordset. Ist aber nur so ne Idee von mir.

Gruß,
Tom

motu 9. Sep 2004 09:18

Re: Datei auswerten
 
Zitat:

Zitat von Jelly
ich würde das ganze in Excel importieren,

Excel war mein erster Ansatz. Wenn ich das aber in Excel packe, kann ich doch die ganze Auswertung gleich per VBA machen. Doch leider konnte mir da noch keiner helfen. Bei Delphi wurde mir glaich gesagt, Array, Parse, Rechnen, Fertsch. Außerdem sind 90 Dateien dieser Art zu überprüfen. Bei Delphi könnt ich die zur Not doch auch mit einem Mal abarbeiten.

Mir ist's egal, wichtig ist mir nur entweder Excel oder Delphi, nur nicht beides. Bei beidem habe ich den selben Aufwand mir neues Wissen anzueignen.

motu

mumu 9. Sep 2004 11:48

Re: Datei auswerten
 
meiner meinung nach total umständig über excel zu gehen und das bringt auch nix

MrSpock 9. Sep 2004 12:09

Re: Datei auswerten
 
Hallo Motu,

ich bezweifle, dass du das Programm hier entwickeln lassen kannst. Du bist lange genug dabei, um zu wissen, dass wir nur Hilfe zur Selbsthilfe leisten.

Ich würde die Datei Zeilenweise über ein TextFile einlesen und mir dann eine Procedure
Delphi-Quellcode:
procedure HoleFeld(zeile: String; n: Integer);
schreiben, die das n-te Feld aus der Zeile holt.

Versuche das doch einmal hinzubekommen, dann ist es wirklich nicht mehr schwer. ... und wenn es nicht weiter geht, hast du ja uns :mrgreen:

motu 9. Sep 2004 12:24

Re: Datei auswerten
 
Zitat:

Zitat von MrSpock
Ich würde die Datei Zeilenweise über ein TextFile einlesen ...

Hmm. hatte mir schon vor dem Mittagessen folgensdes zusammengebaut:

Code:
    AssignFile(LogDatei, Opendialog1.FileName);
    Reset(Logdatei);
    while not Eof(Logdatei) do
    begin
      Read(logdatei, line);
      alles := alles + line;
    end;
Das scheint aber nicht so gut zu sein, da mein Rechner die Ganze Pause bei 100% CPU-Last lief und raus kam nix. hab letztendlich das Programm abgeschossen. Als Datei habe ich die Bsp. Datei genommen.

motu 9. Sep 2004 12:37

Re: Datei auswerten
 
:wall:

Code:
    AssignFile(LogDatei, Opendialog1.FileName);
    Reset(Logdatei);
    while not Eof(Logdatei) do
    begin
      Read(logdatei, line);
      alles := alles + line;
    end;
ein readln schafft abhilfe. :oops:

motu 9. Sep 2004 12:51

Re: Datei auswerten
 
Zitat:

Zitat von MrSpock
Ich würde die Datei Zeilenweise über ein TextFile

Bei
Delphi-Quellcode:
      ResDatei: TextFile;
...
      Readln(Logdatei, Resdatei);
Bekomm ich immer nen Typen konflikt. :wall:

wie sagt ich dann Delphi das es in ganz bestimmten Spalten suchen soll?

MrSpock 9. Sep 2004 13:30

Re: Datei auswerten
 
Hallo Motu,

versuch's mal so:
Delphi-Quellcode:
var
  line: String;
  LogDatei: Textfile;
begin
  AssignFile(LogDatei, Opendialog1.FileName);
  Reset(Logdatei);
  while not Eof(Logdatei) do
  begin
      Readln(logdatei, line);
      LineAuswerten(line)
  end;
end;

motu 9. Sep 2004 13:33

Re: Datei auswerten
 
Zitat:

Zitat von MrSpock
Hallo Motu,

Delphi-Quellcode:
      LineAuswerten(line)

Und was muß in die procedure LineAuswerten? Außerdem sind meine Daten ja da noch nicht im Array.

fiasko 9. Sep 2004 13:49

Re: Datei auswerten
 
Zitat:

Zitat von motu
Zitat:

Zitat von MrSpock
Hallo Motu,

Delphi-Quellcode:
      LineAuswerten(line)

Und was muß in die procedure LineAuswerten? Außerdem sind meine Daten ja da noch nicht im Array.

Das mit dem Array ist IMHO Quark, denn du brauchst die Daten ja nur einmal?! Die LineAuswerten ist die magische Funktion die du noch selber schreiben mußt. Die muß eigentlich nur mit MrSpock's vorgeschlagenem HoleFeld überprüfen ob es eine gültige Zeile ist (also alle 3 Werte >10 oder wie das war...).

motu 9. Sep 2004 13:53

Re: Datei auswerten
 
Zitat:

Zitat von fiasko
Das mit dem Array ist IMHO Quark, denn du brauchst die Daten ja nur einmal?!

Ne. Das ist ja nur der erste Schritt. Dann muß ich die Zeilennummern speichern, um dann in fast allen Spalten auf Grundlage der betreffenden Zeilen meine Berechnungen zu machen. Ich denke, wenn ich die Daten in ein Array packe ist das schon gut.

fiasko 9. Sep 2004 13:56

Re: Datei auswerten
 
Wieso machst du das nicht gleich während des auslesens? Zur Berechnung brauchst du doch immer nu die 3 Zahlen einer Zeile? Dann gibt es keinen Grund den Speicher damit vollzuhauen.

motu 9. Sep 2004 14:02

Re: Datei auswerten
 
Zitat:

Zitat von fiasko
Wieso machst du das nicht gleich während des auslesens? Zur Berechnung brauchst du doch immer nu die 3 Zahlen einer Zeile? Dann gibt es keinen Grund den Speicher damit vollzuhauen.

Ich weiß nicht ob wir aneinander vorbeireden und gebe offen zu das mein Delphiwissen zu Null tendiert. In der Datei sollen die drei Spalten als Referenzspalten dienen. Anhand dieser Spalten weiß ich, wo in den anderen Spalten interessante Werte sind. Wenn also die Spalten dort in aufeinanderfolgenden Zeilen Werte größer 10 sind, weiß ich, das ich in den anderen Spalten den Mittelwert/Stdabw. dieser Zeilen bilden muß. wenn dann ziwschendurch das Kriterium (Wert>10) nicht mehr erfüllt ist, sollen die nächsten zusammenhängenden Zeilen die dem Kriterium entsprech für eine neue Berechnung genutzt werden.

MrSpock 9. Sep 2004 14:47

Re: Datei auswerten
 
Hallo Motu,

wenn du die Datei zeilenweise einliest, musst du die Zeile in ihre Bestandteile zerlegen. Dafür hatte ich die Prozedur vorgeschlagen. Besser wäre sogar eine Function:

Delphi-Quellcode:
function HoleFeld(zeile: String; n: Integer): String;
Wenn du dann die Felder hast (als String), kannst du diese umwandeln in z.B. Extended Values. Diese kannst du dann auswerten oder in ein Array schreiben und dann weiterverarbeiten. Der nächste Schritt ist aber die Zerlegung einer Zeile, das sogenannte Parsen.

glkgereon 9. Sep 2004 15:53

Re: Datei auswerten
 
du kannst sie DIREKT auswerten, und dann nur den mittelwert in nem array speichern, oder sogar den direkt in ne datei schreiben...

so in etwa:
Delphi-Quellcode:
while not eof(logdatei)do
  begin
  holzeile(temp);
  wertezeileaus(temp);
  end;
dein holzeile:

Delphi-Quellcode:
readln(datei,temp);
result:=temp;
dann dein wertezeileaus:

Delphi-Quellcode:
zerlegezeile(line, teil1, teil2, teil3);
if (strtoint(teil)>10) and (strtoint(tei3)>10) and (strtoint(tei3)>10)
then
  begin
  mittelwerte[anzahl+1]:=(strtoint(teil)+strtoint(tei2)+strtoint(tei3))/3;
  anzahl:=anzahl+1;
  end;
so, temp isn string, teil1-3 auch
mittelwerte isn array of double/extended/was auch immer
anzahl die anzahl der mittelwerte -> integer

der rest is deine aufgabe, zb zerlegezeile

motu 10. Sep 2004 07:27

Re: Datei auswerten
 
Danke für den Code. :)

Zitat:

Zitat von glkbkk
du kannst sie DIREKT auswerten, und dann nur den mittelwert in nem array speichern, oder sogar den direkt in ne datei schreiben...

Aber drücke ich mich so schlecht aus? die Mittelwerte brauch' ich nicht von den Zeilen, sondern von den Spalten. Die Zeilennummern brauch' ich damit ich weiß, welche Zeilen der Spalten wichtig sind. Welche Zeilen wichtig sind sehe ich in meinen Referenzspalten. Ich müßte also jeden Zahlenwert in ein Arrayfeld werfen. Das geht bestimmt mir ner for Schleife. Dann weiß ich ja wo was liegt. Dann suche ich die wichtigen Zeilen und merke mir die Zeilennummern. Damit kann ich dann in allen Spalten Mittelwerte/Stdabwen der wichtigen Zeilen berechnen.

Ist jetzt vielleicht klar, was ich überhaupt machen möchte? :?

motu 10. Sep 2004 07:41

Re: Datei auswerten
 
Wenn man keene Ahnung hat kann det ja jarnischt wern. :wall:

Ich war immer drauf aus, die Datei in ein Array zu werfen und dann zu parsen. Dabei muß ich erst parsen und dann werfen. Naja dazu bin ick hier.

Ich probiers mal mit nem Codeschnipsel, den ich gefunden habe. Wenn ich da was nicht hinkriege, meld ich mich wieder.

Danke an alle die mir Zeit und Geduld opfern.

motu 10. Sep 2004 10:12

Re: Datei auswerten
 
Jetzt hab ich erstmal meine Daten im Array. :-D

Jetzt muß ich meine Spalten überprüfen ich dachte an:
Delphi-Quellcode:
    for i:=0 to m do //m - Zeilenanzahl
      begin
        if (data[17,i] > 10) and (data[18,i] > 10) and (data[19,i] > 10) then
        IrgendEinSpeicher := m;
      end;
So.
Problem 2: Was nehm ich dem am besten für einen Speicher um meine Zeilennummern zu merken?
Problem 3: Wie überprüf' ich, ob die Zeilennummern ein zusammenhängende Zahlenfolge sind?
:gruebel:


edit: einige Sachen schon selbst rausgefunden

Wär es nicht auch gleich möglich, wenn ich die Zeilenummer habe, Werte der Spalten in eine Liste zu speichern? Wenn sie Zeilennummer springt, wird eine neue Liste begonnen. Meine Liste kann ich dann an meine Funktionen übergeben

Golze 10. Sep 2004 10:29

Re: Datei auswerten
 
Hallo Motu,
ich möchte die etwas korrigieren
Zitat:

Du hast mir ja Deine Dienste angeboten
Ich hatte dir meine Hilfe bei Problemen angeboten. Ich kann nicht dir dein Programm schreiben. Aber ich kann dir Hilfen, daß du deine Aufgabe lösen kannst. Wenn du so willst, sehe mich als Coach an.

Zum Fachlichen deines Beitrags: (in den vorherigen Beträgen wurde dazu bereits Source Code beschrieben)
1) Öffne die Datei mit AssignFile(filevar, dateiname) und Reset(filevar).
2) Lese die Daten mit Readln(filevar, stringbuffer) ein.
3) Lese jede Spalte mit seinem Feld ein und konvertieren die Stringabbildungen in Real-Zahlen.
4) Speichere die Zahlen jeder Zeile in ein eigenes Objekt mit dem Namen "TMessdaten". Das Objekt enthält als Objekteigenschaften und damit lokale Variablen die jeweiligen Spalten deiner Datei als Realzahlen.
Delphi-Quellcode:
  TMessdaten = class(object)
  private
     ...F_spaltennamen: Real;
  public
    property ...spaltennamen: Real
      read F_spaltennamen write F_spaltennamen
  end;
5) Speichere das Objekt mit dem TList-Objekt der VCL in einer internen Liste ab.
Delphi-Quellcode:
  FList := TList.Create;
  repeat
    ...zeile aus datei einlesen...
    FMessdatenzeile := TMessagen.Create;
    FList.Add(FMessdatenzeile);
    FMessdatenzeile.spaltenname := StringInZahl(HoleZahlEinerSpalte(eingeleseneZeile));
  until EOF(filevar);

  ...nun daten mit der internen darstellung beliebig bearbeiten...
  for i := 0 to FList.Count-1 do
  begin
   TMessdaten(FList.Item[i]).spaltenname .... berechnen, verrechnen etc.
   ....

  end;
6) Am Ende der Datei, schließe die Datei mit CloseFile(filevar).

Nun kannst du die Daten in deiner internen Liste, die pro Eintrag nun deine Zahlen einer Zeile enthält schnell und einfach bearbeiten.

Grüße Kay

motu 10. Sep 2004 11:00

Re: Datei auswerten
 
Also mein Array ist voll, die Datei auch schon wieder zu.
nun habe ich folgenden Idee:

Delphi-Quellcode:
  if (data[17,i]>10) and (data[18,i]>10) and (data[19,i]>10) then
    if saveint=i-1 then
//  jeden werte einer spalte dieser Zeil in eine eigene liste
    saveint:=i;

    else
    saveint:=i;
Jetzt besteht das Problem, das die erste Zeile mit Werten nicht beachtet wird und ich hab grad keine Idee, wie ich, sobald ein neuer Wertblock anfängt, eine neue Liste beginne. Ich könnte ja in jedem Else-Fall den Listenindikator um eins erhöhen. dann haben alle zusammenhörenden Liste den gleich Indikator. Es ist doch bestimmt möglich leere Liste einfach wegfallen zulassen und die bestehenden einfach neu durchzunummerieren.


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