Forum: PC-Programmierung Messauswertung - Minima/Maxima suchen


von Mathias (Gast)


Lesenswert?

Hallo zusammen,
ich habe folgendes Problem, ich mache jeden Tag sehr viele Messungen und 
bin nun auf der Suche das ganze etwas zu erleichtern.
Ich habe pro Messung ca. 1000 x und y Werte, da ich aber 
Vergleichsmessungen machen hab ich da teilweise bis zu mehrere 1000 
Dateien.
Ich würd mir gern ein Prog schreiben, was mir in einem vorgegebenen 
x-Bereich  den kleinsten bzw. größten y-Wert raussucht und diese Werte 
dann ausgibt. Was meint ihr wie sich so ein Prog am besten umsetzen 
lässt, gnuplot, C++, awk? Oder gibt es da schon was ?

Gruß Mathias

von Frank B. (frankman)


Lesenswert?

Ich würde dir evtl. die Software CATMAN von der Firma Hottinger Baldwin 
empfehlen. Es handelt sich dabei um eine spezielle Messtechnik-Software, 
die extra auf solche Probleme zugeschnitten ist. Die Software erlaubt 
das erfassen, speichern, auswerten von Messwerten. Die Software kann 
G-byte-weise Messdaten verwalten oder grafisch darstellen. Kostet 
allerdings etwas.
Aber zusätzlich hast Du da einen sehr mächtigen Script-Editor zu 
verfügung, der auch eine Datenbankanbindung, Kommunikation mit Word und 
Excel ect. zulässt und sehr schnell und einfach zu erlernen ist.

von Mathias (Gast)


Lesenswert?

Danke für den Tip, darüber werd ich mal nachdenken, aber kurzfristig 
muss ich mir erst mal selbst was basteln und hatte auf ein paar Tips 
gehofft...

Gruß Mathias

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:
> Danke für den Tip, darüber werd ich mal nachdenken, aber kurzfristig
> muss ich mir erst mal selbst was basteln und hatte auf ein paar Tips
> gehofft...

Na ja. Was soll man dir da an Tips geben?
Welche Programmiersprache kannst du denn?
In der würde ich das machen.

Die Funktionalität an sich ist ja eher trivial wenn man eine
Programmiersprache beherrscht.

Wenn du aber erst noch programmieren lernen musst:
Kauf dir was Fertiges oder such dir jemanden der das
kann. Das geht kurzfristig schneller als wenn du erst noch
programmieren lernen musst. Aus deinem 'kurzfristig' werden
sonst nämlich schnell mal ein paar Wochen.

von M@D (Gast)


Lesenswert?

N'abend!

Liegen die Messungen bzw. deren Aufzeichnungen denn schon als Datei auf 
dem Rechner vor (z.B. als CSV-Datei), oder wird das Ganze über 'ne 
Schnittstelle (COM/USB) in "Echtzeit" eingelesen und verarbeitet?
Ersteres wäre in der Umsetzung ja relativ einfach, da könnte ich Dir ein 
kleines Programm schreiben, welches die Daten vergleicht.
Zweiteres ist natürlich auch möglich - da müßte man dann halt das 
Kommunikationsprotokoll kennen, um die Daten auseinander zu pflücken.
Mit welchem OS arbeitest Du denn vorzugsweise bzw. soll das Ganze unter 
WIN oder Linux laufen?
Falls Dateien bereits vorhanden sein sollten, dann schick' sie bitte per 
Mail: m a d - m e d i a @ g m x . d e (ohne Leerzeichen)

Wenn Du ein paar Eckdaten dazu frei gibst, dann werd' ich mal schauen, 
was man da machen kann.

Greetz M@D

von Mathias (Gast)


Angehängte Dateien:

Lesenswert?

Ja, die Dateien liegen schon vor, als *.txt, mach mal in eine in den 
Anhang...
Die Grundlagen in C/C++ krieg ich hin...
Würd die Daten aus dem File gerne in ein 2D Array speichern, weiß aber 
nicht wie es geht...

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:
> Ja, die Dateien liegen schon vor, als *.txt, mach mal in eine in den
> Anhang...
> Die Grundlagen in C/C++ krieg ich hin...
> Würd die Daten aus dem File gerne in ein 2D Array speichern, weiß aber
> nicht wie es geht...

Musst du mit den Daten sonst noch was machen?

Grund: Um das Minimum/Maximum zu finden, musst du die Daten
nicht im Speicher zwischenspeichern.

Du liest eine Zeile ein und vergleichst sie mit dem momentanen
Minimum/Maximum. Falls erforderlich gibt es ein Update der
entsprechenden Min/Max Variablen.
Und das wars dann auch schon. Du brauchst die eingelesenen
Daten nie mehr wieder. Also wozu sie aufwändig speichern?

in Pseudocode:

   Datei öffnen (mit entsp. Fehlerbehandlung)

   erstes Datenpärchen lesen und als momentanes Min/Max zuweisen

   solange ein Datenpärchen von der Datei gelesen werden kann {
      Sind die Zahlen kleiner als Min
         -> Min einen neuen Wert zuweisen
      Sind die Zahlen größer als Max
         -> Max einen neuen Wert zuweisen
   }

   Datei schließen

   Min/Max  ausgeben

von Karl H. (kbuchegg)


Lesenswert?

Mal ein Ansatzpunkt
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
5
void Help()
6
{
7
  printf( "Usage: MinMax <filename>\n" );
8
}
9
10
int main( int argc, char* argv[] )
11
{
12
  double MinX, MinY;
13
  double MaxX, MaxY;
14
  double TmpX, TmpY;
15
  unsigned char First = 1;
16
  char InBuffer[1024];
17
  
18
  if( argc != 2 ) {
19
    Help();
20
    return EXIT_FAILURE;
21
  }
22
  
23
  FILE* hFile = fopen( argv[1], "r" );
24
  if( hFile == NULL ) {
25
    printf( "Error opening file: '%s'\n", argv[1] );
26
    return EXIT_FAILURE;
27
  }
28
  
29
  while( fgets( InBuffer, sizeof( InBuffer ), hFile ) &&
30
         strcmp( InBuffer, "#End of File" ) != 0 ) {
31
    if( strlen( InBuffer ) == 0 )
32
      continue;
33
      
34
    if( sscanf( InBuffer, "%lf %lf", &TmpX, &TmpY ) == 2 ) {
35
      if( First ) {
36
        MinX = TmpX;
37
        MinY = TmpY;
38
        MaxX = TmpX;
39
        MaxY = TmpY;
40
        First = 0;
41
      }
42
      else {
43
        if( TmpY < MinY ) {
44
          MinY = TmpY;
45
          MinX = TmpX;
46
        }
47
        if( TmpY > MaxY ) {
48
          MaxY = TmpY;
49
          MaxX = TmpX;
50
        }
51
      }
52
    }
53
  }
54
  
55
  if( !feof( hFile ) ) {
56
    printf( "Error during reading of: '%s'\n", argv[1] );
57
  }
58
  else {
59
    printf( "Minimum: x:%lf y:%lf\n", MinX, MinY );
60
    printf( "Maximum: x:%lf y:%lf\n", MaxX, MaxY );
61
  }    
62
  
63
  fclose( hFile );
64
  
65
  return EXIT_SUCCESS;
66
}

von Mathias (Gast)


Lesenswert?

Vielen Dank,
das hilft mir ein ganzes Stück weiter...
Vom Konzept her hab ich so ähnlich gedacht...
Eine Frage noch,
wenn ich das richtig verstanden habe übergebe ich der main Funktion bei 
argv den Dateinamen?
Ich habe ja meistens um die 500 Dateien...

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:
> Vielen Dank,
> das hilft mir ein ganzes Stück weiter...
> Vom Konzept her hab ich so ähnlich gedacht...
> Eine Frage noch,
> wenn ich das richtig verstanden habe übergebe ich der main Funktion bei
> argv den Dateinamen?

Ja.

> Ich habe ja meistens um die 500 Dateien...

Würde ich nicht per C-Program erledigen, sondern extern von der
Shell aus mit einer Batch-Datei.

von Mathias (Gast)


Lesenswert?

Hallo nochmal,
bin jetzt schon ein bissl weiter, mir ist jetzt aber aufgefallen das es 
doch besser ist, wenn ich die Werte in ein 2D-array schreibe.
Mit fgets lade ich ja quasi alles,
wie kann ich denn die Werte Zeile für Zeile in das arraa einlesen?

Vielen Dank schon mal

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:
> Hallo nochmal,
> bin jetzt schon ein bissl weiter, mir ist jetzt aber aufgefallen das es
> doch besser ist, wenn ich die Werte in ein 2D-array schreibe.

Das glaub ich nicht.
Das willst du unter allen Umständen vermeiden, wenn es nur irgendwie
möglich ist. Denn dann wirds richtig aufwändig.
Und wenn ich mir so ansehe an welchen Problemen du so scheiterst,
glaube ich nicht, dass du das in C korrekt hinkriegst.

Aber seis drum:
Die einfachste Variante ist es, das File 2 mal zu lesen.
Einmal um festzustellen wieviele Datensätze es gibt.
Nach dieser Zahl wird dann das Array dynamisch allokiert
und erst dann werden die Daten in das Array geladen.

> wie kann ich denn die Werte Zeile für Zeile in das arraa einlesen?

Genauso wie ich es jetzt auch mache.

Wir sind jetzt genau an dem Punkt an dem ich sagte:
Such dir jemanden der das kann oder kauf dir was Fertiges.
Denn aus dem 'schnell mal machen' werden sonst Wochen.
Du bist jetzt genau an dem Punkt angelangt an dem sich die
Aufgabenstellung zu einer Mehr-Wochenarbeit entwickelt, weil dir
die Grundlagen fehlen.

von Mathias (Gast)


Lesenswert?

C is kein Problem,
ich habe aber bisher nichts in die Richtung mit Dateien bearbeiten etc 
gemacht. Was ich bei dem Programm momentan noch als Problem sehe, das 
ich nur in einem bestimmten Bereich der x-Werte das Minima bzw. Maxima 
raussuchen will und nicht von der gnazen Datei.

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:
> C is kein Problem,

Sorry.
Aber wenn es an dynamischer Speicherverwaltung happert,
am Einlesen von Daten in ein Array, dann IST C EIN PROBLEM.

Das sind alles C-Grundlagen: Einführung in C, Lektion 6 oder 7

von Karl H. (kbuchegg)


Lesenswert?

Mathias wrote:

> ich nur in einem bestimmten Bereich der x-Werte das Minima bzw. Maxima
> raussuchen will und nicht von der gnazen Datei.

Wie definiert sich denn der Bereich?

von Mathias (Gast)


Lesenswert?

Sorry,
ich hatte nen Fehler drin es läuft jetzt erst mal...
den Bereich möchte ich selber angeben

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Um so etwas mit C zu machen muss man schon Masochist sein, 
Skriptsprachen sind dazu besser geeignet. Beispiel in Ruby:
1
# Bereich definieren
2
bereich = 5.0..10.5
3
4
# auf jede Datei im Ordner daten anwenden
5
Dir.glob('daten/*.txt').each do |name|
6
  # Datei öffnen und zeilenweise bearbeiten
7
  File.open(name).each_line do |l|
8
    # Zeile aufspalten und zu float konvertieren
9
    x, y = line.split.map{|n| n.to_f}
10
    if bereich.include?(x)
11
      # mit y initialisieren, falls min/max-Werte noch leer
12
      y_min ||= y
13
      y_max ||= y
14
15
      # min/max-Werte zuweisen
16
      y_max = [y_max, y].max
17
      y_min = [y_max, y].max
18
    end
19
  end
20
end

von Mathias (Gast)


Lesenswert?

hört sich gut an,
aber dazu müsste ich erst ne skriptsprache lernen...

von Mathias (Gast)


Lesenswert?

awk kann ich nur wenige Grundlagen...

von yalu (Gast)


Lesenswert?

> hört sich gut an, aber dazu müsste ich erst ne skriptsprache
> lernen...

Falls du öfters mal ganz schnell ein kleines Progrämmchen schreiben
möchtest, bei dem die Entwicklungszeit deutlich wichtiger als die
Laufzeiteffizienz ist, solltest du erwägen, eine der Sprachen Perl,
Python oder eben Ruby zu lernen.

Diese Sprachen (insbesondere die letzten beiden) sind sehr leicht zu
lernen. Nach einem Tag Tutorial Durcharbeiten kann man schon ziemlich
viel. Da alle drei Sprachen auch interaktiv benutzt werden können, ist
auch "exploratives Lernen" möglich.

Im Gegensatz zu typischen Skriptsprachen (wie bspw. Shell-Sprachen)
sind die Perl, Python und Ruby vollwertige Programmiersprachen mit
Objektorientierung, sehr umfangreichen Bibliotheken usw., so dass man
auch größere Softwareprojekte damit realisieren kann.

So, und jetzt zum Spaß deine Aufgabe einmal als Python-Progrämmchen
unter Verwendung von funktionalen Elementen:
1
u=1.3; o=2.7; f="test.txt"
2
print max(y for x,y in (map(float, z.split()) for z in file(f)) if u<=x<=o)

u und o sind die vorgegebenen Grenzen für x, f der Dateiname.

Der Ausdruck nach dem print bestimmt das Maximum aller y für alle
Zahlenpaare (x,y) die sich aus dem Aufsplitten der einzelnen Zeilen
von f in zwei Float-Zahlen ergeben, und deren x in [u,o] liegt.

Man kann das Programm natürlich genauso gut "klassisch" mit einer
For-Schleife und Variablen für Zwischenergebnisse hinschreiben. Jedem
wie's ihm beliebt.

von Mathias (Gast)


Lesenswert?

@  Andreas Schwarz
Wie würde die Erweiterung zu dem Ruby Skript aussehen um die Min/Max 
Werte in eine Datei zu schreiben?
Hab mir jetzt überlegt, das ich mir Ruby aneignen möchte...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Z.B. so:
1
# Bereich definieren
2
bereich = 5.0..10.5
3
4
outfile = File.open('minmax.txt', 'w')
5
6
# auf jede Datei im Ordner daten anwenden
7
Dir.glob('daten/*.txt').each do |name|
8
  # Datei öffnen und zeilenweise bearbeiten
9
  File.open(name).each_line do |l|
10
    # Zeile aufspalten und zu float konvertieren
11
    x, y = line.split.map{|n| n.to_f}
12
    if bereich.include?(x)
13
      # mit y initialisieren, falls min/max-Werte noch leer
14
      y_min ||= y
15
      y_max ||= y
16
17
      # min/max-Werte zuweisen
18
      y_max = [y_max, y].max
19
      y_min = [y_max, y].max
20
21
      outfile.printf("%f, %f\n", y_max, y_min)
22
    end
23
  end
24
end

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.