Verfasst am: 10.07.2012, 23:19
Titel: Messdaten Einlesen, Datum aus Header nutzen
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.
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;
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
% 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
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
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
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
Einstellungen und Berechtigungen
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
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.