WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Messdaten Einlesen, Datum aus Header nutzen

 

JScherer
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2012, 23:19     Titel: Messdaten Einlesen, Datum aus Header nutzen
  Antworten mit Zitat      
Hallo,
zur automatischen Auswertung von Messdaten sollen Dateien (siehe angehängte Datei) eingelesen, sortiert und verarbeitet werden. Beim Einlesen und Sortieren habe ich folgendes Probleme:
-Mir ist es nicht möglich die Zeit aus den Headern auszulesen.
-Regen- und Schneefall (Letzte Zeile eines Datensatzes) kann ich auch nicht auslesen
-mir fehlt kenntniss das ganze über fopen aufzuziehen, außerdem besitzen nicht alle Header exakt die gleiche Zeichenanzahl
-Die Rechenzeit ist recht lange (sekundäres problem)

Da ich annehmen muss, dass es so wie ich es angefangen habe nicht funktionieren wird (siehe unten...) kann ich den funktionierenden Teil des Programms inclusive Beschreibung nur additiv anhängen (Quelltexte, unten).

Ich bin mir sicher, es würde über "fopen" funktionieren, leider fehlt mir hierzu das nötige Matlab Wissen zur Umsetzung.

Kann sich das (Messwertdatei unten...) mal Jmd. ansehen und mir sagen, wie
1.: die Uhrzeit aus den Headern auslesen ist
2.: Regen und Schnee aus den Headern ausgelesen werden kann
und nach möglichkeit:
3.: die Messwerte gleich beim einlesen am effektivsten in dateien für die entsprechenden höhen (erste spalte) abgelegt werden können.


Vielen dank schonmal.


gruß Jochen



____________________________________________________

Das einlesen läuft durch das Ausführen folgender 3 Skripte bzw. Funktionen ab:

Code:

function [outs]=NNewDataSet
% Dateien aus Verzeichniss Auswählen, Dateienamen an auslese routine übergeben

fdir = cd;                 % Startverzeichniss auf Programmverzeichniss setzen
fdir = uigetdir(fdir, 'Verzeichniss auswählen');
files=dir('*.dat');      % Name betreffender Dateien Einlesen (annm.:
                              % Alle dat-dateien im Verzeichniss sind Messdaten
for k=1:numel(files) % Umstrukturierung der File-namen in Variable
    allfilenames(k,:)=(files(k).name);
end;
eval(['cd ', fdir])      
global data              % andere übergabe war mir leider nicht möglich

% für alle Dateien...
for ik=1:numel(files)
    fname=[str2mat(allfilenames(ik,:))];
                             % Datum aus Dateiname generiert...
    eval(['outs(',num2str(ik),').date=fname(2:7);']);
                             % Messwerte aus Datei (s. nächste fkt.)
                             % Header Nr. 1 = 4 Zeilen
    eval(['outs(',num2str(ik),').data=WRead(fname,4);']);
end;

 






Code:

function [indata]=WRead(fname,HEADERLINES)
% 1. Anzahl Headerlines bzw. 2. Auslese-Startpunkte erstellen, An importfunktion übergeben, 3.Abbruchkriterium durch try-catch

% 1.:
ik=0;
global data                           % Messdaten übernehmen...
ReadPoint=HEADERLINES;
% 2.:
importfile(fname,ReadPoint); % von Matlab erstellter Programmcode
                                           % vgl. open(filename) -->Generate ML-Code

eval(['indata.point',num2str(ik),'=data;']);
ik = ik+1;

% 1.:
LENGTH_READ     = size(data,1)+HEADERLINES+1;
ctr=0;
while ctr==0;
% 3.:
    try                 % ...Bis fehler, weil Datei zu ende...
                         % Startpunkt, ab dem im Schritt eingelesen wird
        ReadPoint   = HEADERLINES + ik * LENGTH_READ;
        eval(['importfile(fname,ReadPoint);']);
        eval(['indata.point',num2str(ik),'=data;']);
        ik = ik+1;
    catch
        break;
        ctr = 1;
    end
end
 



Von Matlab Automatisch erstellter Quell-code
Code:

function importfile(fileToRead1,HEADERLINES)

DELIMITER = ' ';
% Import the file
newData1 = importdata(fileToRead1, DELIMITER, HEADERLINES);

% Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars)
    assignin('base', vars{i}, newData1.(vars{i}));
end


 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.07.2012, 13:33     Titel: Re: Messdaten Einlesen, Datum aus Header nutzen
  Antworten mit Zitat      
Hallo JScherer,

Keine Antwort, aber ein kurzer Kommentar:

Die EVALs sind vollkommen überflüssig, machen den Code aber anfällig für Fehler und bremsen Matlab deutlich aus.

Code:

% eval(['cd ', fdir])  ==>
cd(fdir);

global data              % andere übergabe war mir leider nicht möglich

%    eval(['outs(',num2str(ik),').date=fname(2:7);']);
% Das Einschmuggeln eines Indices in den Namen der Variablen sollte man
% sich unbedingt ersparen. Indices implementiert man am besten als
% Indices:
outs(ik).date=fname(2:7);
outs(ik).data=WRead(fname,4);

% eval(['indata.point',num2str(ik),'=data;']);
indata.sprintf('point%d', ik) = data;
% Nun, auch hier wäre ein Index als Index praktischer. Aber per "dynamic
% fieldnames" geht es zumindest effizient

% eval(['importfile(fname,ReadPoint);']);
importfile(fname,ReadPoint)
% eval(['indata.point',num2str(ik),'=data;']);
indata.sprintf('point%d', ik) = data;
 

Die Daten per ASSIGNIN in den Base-Workspace zu schreiben, ist ebenfalls ein schlechter Programmierstil: Falls man später versucht beim Debuggen herauszufinden, woher ein bestiommter Wert stammt, hat man nach ASSIGNIN keine Chance mehr.
Es ist viel besser, Variablen als STRUCT oder direct als Outputs zu übergeben.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 11.07.2012, 21:01, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
JScherer
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 15:02     Titel:
  Antworten mit Zitat      
Danke Schonmal Jan,

ich hab auch gefunden, wie ich die Datei über
Code:

    fid=fopen(fname);
    A=fread(fid, 'uint8=>char')'
 

einlesen kann. Wirklich weiter bringt mich das ganze aber noch nicht, ich hab da dann nur einen string-Vektor. Gibt es da vielleicht eine möglichkeit diskret auf einzelne Zeilen zuzugreifen, auch wenn man die Zeilenlänge nicht kennt?

Zitat:
"... Es ist viel besser, Variablen als STRUCT oder direct als Outputs zu übergeben..."
Wie kann ich das direkt als STRUCT ablegen? Hätte mir auch eher zugesagt.


Gruß, Jan

gruß Jochen
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.