Die Mathe-Redaktion - 21.11.2018 00:53 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt5 im Schwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 390 Gäste und 11 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von mire2 gaussmath
Mathematische Software & Apps » Matlab » GNU Octave Messdaten aus .txt Datei einlesen
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule GNU Octave Messdaten aus .txt Datei einlesen
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2018-05-24


Hallo,

ich würde gerne meine Messdatenauswertung ein Stück weit automatisieren. Der erste Schritt wäre das automatische erkennen der relevanten Daten aus der Datei die mein Messgerät ausspuckt.
Die sieht ungefähr so aus:
Zeitstempel: 16.05.2018 12:10
Messdauer: 0   01:05:57
Position.X: 47.000 mm
Position.Y: 102.000 mm
Position.Z: 140.000 mm
Position.Phi: 0.000 deg
Zeitkonstante: 1 s
Messbereich: 500 uV
Scanwinkel.Phi: 158.400 deg
Schrittweite.Phi: 4.400 deg
Scanweg.Y: 12.000 mm
Schrittweite.Y: 0.400 mm
DelayTime: 1500 ms
 
Daten.Bezeichnung: Phase
Daten.Einheit: deg
Daten:
152.958E+0	152.124E+0	152.610E+0	
150.546E+0	151.476E+0	152.172E+0
153.228E+0	152.142E+0	151.776E+0
 
 
Daten.Bezeichnung: Amplitude
Daten.Einheit: V
Daten:
117.571E-6	120.849E-6	120.670E-6
133.903E-6	136.823E-6	128.598E-6
130.744E-6	129.045E-6	127.883E-6
Das wichtigste wäre zunächst mal die Amplituden- und die Phasendaten auszulesen und jeweils in eine Matrix zu schreiben.

Der Beginn der Phasendaten ist immer in der gleichen Zeile, die Anzahl der Zeilen, in denen Messdaten stehen kann aber von Messung zu Messung variieren. Dementsprechend verändert sich dann auch der Beginn und das Ende der Amplitudendaten.
Das lässt sich doch bestimmt irgendwie einrichten, dass Octave das selbst und automatisch erkennt, oder?

Zusätzlich würde ich auch gerne anderen Werte wie z.B. Position.X auslesen, aber natürlich nur die Zahl dahinter, ohne Einheit und Text.

Ich habe schonmal mit der Funktion dlmread gearbeitet, aber ich glaube das funktioniert hier nicht und wenn doch weiß ich nicht wie.



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2438
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2018-05-24


Hallo,

ich glaube nicht, dass das automatisch geht. Es sollte aber kein Problem sein, sich ein Programm zu schreiben, dass die Datei zeilenweise einliest und auswertet. Dabei helfen Funktionen wie fopen, fclose, fgetl, fscanf und strcmp.


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2018-05-26


Hm...
Das GNU Octave Handbuch erzeugt bei mir meistens mehr Fragen, als es beantwortet.
Ich habe bisher:
Octave
clear
clc
 
fid = fopen ("Testdatei.txt");
str = fgetl (fid)
Die Ausgabe ist dann:
str = Zeitstempel: 16.05.2018 12:10
Gut, jetzt habe ich die erste Zeile gelesen.

Warum ist fid ein double der seinen Wert bei jeder Ausführung um 1 erhöht? Wie kann ich die andere Zeilen lesen?

Bei der Funktion
Octave
[val, count, errmsg] = fscanf ( fid, template, size )
verstehe ich nicht was "template" sein soll.



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2438
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2018-05-26


Hallo,

fopen öffnet eine Datei und liefert ein Dateihandle (ein double, weil das in Matlab der Standardtyp ist) zurück. Das Handle wird intern benutzt, um gewisse Zustandsinformationen, u.a. die aktuelle Position in der Datei, zu speichern. Danach kann man mit dem Handle solange arbeiten wie man will, am Ende sollte man die Datei mit fclose schließen und dabei das Handle übergeben. Öffnet man mehrere Dateien, bekommt man verschiedene Handles. Du öffnest anscheinend dieselbe Datei mehrfach. Damit hast du auch mehrere Dateipositionen usw., das ist nicht besonders sinnvoll. Du solltest einmal fopen aufrufen und dann die Zeilen nacheinander mit fgetl oder fscanf einlesen.

Mit dem Formatstring ("template") bei fscanf gibt man an, wie der gelesene Text interpretiert werden soll. Zum Beispiel erwartet "%d" eine Dezimalzahl, und "Wert: %d" erstmal den Text "Wert: ", dann eine Dezimalzahl. Die anderen Formatcodes stehen in der Hilfe. Das alles kommt historisch aus der Programmiersprache C.

Ich hab grad keine Zeit, vielleicht schreib ich später mal ein kleines Beispiel.



  Profil  Quote  Link auf diesen Beitrag Link
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2018-05-26


Ok, ich erwarte ja Dezimalzahlen. Also habe ich folgendes versucht:
Octave
clear
clc
 
fid = fopen ("Testdatei.txt");
[val, count, errmsg] = fscanf ( fid, "%d" )
fclose ("Testdatei.txt");
Aber auch das liefert nichts brauchbares:
val = [](0x1)
count = 0
errmsg =



  Profil  Quote  Link auf diesen Beitrag Link
dromedar
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 26.10.2013
Mitteilungen: 5123
Aus: München
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2018-05-26


2018-05-26 15:10 - wd-40 in Beitrag No. 4 schreibt:
Ok, ich erwarte ja Dezimalzahlen.

Aber in der Datei, die Du einlesen willst, stehen doch nicht nur Dezimalzahlen. Das Format "%d" sucht nach Dezimalzahlen. Was es findet, ist:

    Zeitstempel: 16.05.2018 12:10

Das ist keine Dezimalzahl. Also bricht fscanf das Einlesen ab, und liefert count = 0 zurück, um Dir zu sagen "da ist keine Dezimalzahl".

Auch wenn Du das Octave-Handbuch nicht magst, wirst Du ohne es zu lesen allein mit try-and-error nicht weit kommen...

Grüße,
dromedar



  Profil  Quote  Link auf diesen Beitrag Link
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2018-05-26


2018-05-26 15:25 - dromedar in Beitrag No. 5 schreibt:
Auch wenn Du das Octave-Handbuch nicht magst, wirst Du ohne es zu lesen allein mit try-and-error nicht weit kommen...

Grüße,
dromedar
Dass ich es nicht mag, ist nicht das Problem. Ich lese es ja trotzdem, nur macht mich das nicht schlauer. Die Information die du mir z.B. gegeben hast, konnte ich dem Handbuch nicht entnehmen und wie es stattdessen funktioniert erklärt es mir auch nicht...



  Profil  Quote  Link auf diesen Beitrag Link
dromedar
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 26.10.2013
Mitteilungen: 5123
Aus: München
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2018-05-26


Das Handbuch ist an dieser Stelle etwas weniger ausführlich, weil innerhalb des Kapitels "C-Style I/O Functions" vorausgesetzt wird, dass man von diesen Funktionen schon mal gehört hat. Wenn das bei Dir nicht der Fall ist, hilft ein Blick in irgendein Buch über C weiter.

Was Du tun solltest, ist, die Funtionen, die Dir ligning in Beitrag No. 1 genannt hat, zu kombinieren:
1. Du liest die Datei mit fgetl, bis Du an die Stelle kommst, wo die Dich interessierenden Phasendaten stehen.
2. Diese Zahlen liest Du dann mit fscanf ein (wobei "%e" statt "%d" zu verwenden ist, denn Du willst ja keine Integers einlesen).
3. Du liest analog zu Schritt (1) weiter, bis Du an die Stelle kommst, wo die Amplitudendaten stehen.
4. Du liest analog zu Schitt (2) die Amplitudendaten ein.



  Profil  Quote  Link auf diesen Beitrag Link
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2018-05-28


Wie kann ich mit fgetl mehr als die erste Zeile einlesen?



  Profil  Quote  Link auf diesen Beitrag Link
dromedar
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 26.10.2013
Mitteilungen: 5123
Aus: München
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2018-05-30


2018-05-28 10:14 - wd-40 in Beitrag No. 8 schreibt:
Wie kann ich mit fgetl mehr als die erste Zeile einlesen?

Ein zweites fgetl würde die zweite Zeile einlesen. Allgemein liest eine Input-Funktion ab der Position weiter, an der die vorangegangene Halt gemacht hat.

Im Octave-Handbuch gibt es hierzu ein Beispiel.



  Profil  Quote  Link auf diesen Beitrag Link
wd-40
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 15.02.2010
Mitteilungen: 153
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2018-06-01


Mit dem Beispiel aus dem Handbuch bekomme ich die letzte Zeile:
Octave
filename = "Testdatei.txt";
fid = fopen (filename, "r");
while (! feof (fid) )
  text_line = fgetl (fid);
endwhile
fclose (fid);
Ich habe versucht, das so zu modifizieren, dass jede Zeile gespeichert wird:
Octave
filename = "Testdatei.txt";
fid = fopen (filename, "r");
index=1;
while (! feof (fid) )
  text_line(index,:) = fgetl (fid);
  index = index +1;
endwhile
fclose (fid);
Das führt aber zu einer Fehlermeldung:
Octave
error: Dateneinlesen: =: nonconformant arguments (op1 is 1x32, op2 is 1x29)
error: called from
    Dateneinlesen at line 5 column 22





  Profil  Quote  Link auf diesen Beitrag Link
dromedar
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 26.10.2013
Mitteilungen: 5123
Aus: München
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2018-06-01


2018-06-01 10:01 - wd-40 in Beitrag No. 10 schreibt:
Das führt aber zu einer Fehlermeldung:
Octave
error: Dateneinlesen: =: nonconformant arguments (op1 is 1x32, op2 is 1x29)
error: called from
    Dateneinlesen at line 5 column 22


Du versuchst, die Zeilen der Datei in eine Matrix einzulesen. Da alle Zeilen einer Matrix die gleiche Länge haben müssen, die Zeilen Deiner Datei diese Eigenschaft jedoch nicht haben, geht das schief.

Das lässt sich an einem einfachen Beispiel leicht nachvollziehen:
Octave
octave:1> text_line (1,:) = "Das wird";
octave:2> text_line (2,:) = "übel enden.";
error: =: nonconformant arguments (op1 is 1x8, op2 is 1x11)

Dieses Problem lässt sich natürlich lösen, aber es spielt für Deine Aufgabe gar keine Rolle, denn warum solltest Du die Datei komplett irgendwohin einlesen. Du willst doch nur den Anfang der Abschnitte in der Datei finden, in der die Dich interessierenden Zahlen stehen, und diese Zahlen dann einlesen.

Wie das gehen könnte, zeigt die folgende Funktion:
Octave
function [label, unit, data] = read_data (fid)
  do
    [label, count] = sscanf (fgetl (fid), 'Daten.Bezeichnung: %s');
  until count == 1;
  unit = sscanf (fgetl (fid), 'Daten.Einheit: %s');
  fgetl (fid);
  data = fscanf (fid, '%e');
endfunction



  Profil  Quote  Link auf diesen Beitrag Link
wd-40 hat die Antworten auf ihre/seine Frage gesehen.
wd-40 wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2018 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]