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

Automatisiertes einlesen von Daten in Matlab

 

Spidy
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 16.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2015, 17:37     Titel: Automatisiertes einlesen von Daten in Matlab
  Antworten mit Zitat      
Hallo Leute

Ich habe eine csv-Datei (siehe Anhang) mit folgendem Aufbau:

In Zeile 2 und 3 wird ein Netz definiert. Im konkreten Beispiel ein 10x10 Netz, also 100 Datenpunkte. Angenommen ich habe 3 Messwerte mir ausgeben lassen, so befinden sich in der selben Datei die jeweiligen Messergebnisse. Wie ihr in der Datei erkennen könnt, sind diese aufgelistet in den Zeilen

Messergebnis 1:
Zeile 5-14

Messergebnis 2:
Zeile 16-25

Messergebnis 3:
Zeile 27-36

Angenommen ich importiere die csv Datei mit:
Code:
data = 'C:\Users\......\myData.csv';


Jetzt möchte ich jedes Messergebnis unter einer eigenen Variablen speichern. Etwa so:

Code:
M1=csvread(data, Zeile 5-14)
M2=csvread(data, Zeile 16-25)
M3=csvread(data, Zeile 27-36)


Der entscheidene Punkt ist, dass ich diesen Schritt möglichst automatisiert, also mit einer Schleife, durchführen möchte. Unter Umständen habe ich 100 Messergebnisse und dann wäre das sehr sinnvoll. Am besten wäre es, wenn ich ganz am Anfang abfrage, wieviel Messergebnisse ich habe (z.B. 3) und wie groß die Messergebnisse sind (im konkreten Beispiel jeweils 10 Zeilen).

Könnt ihr mir dabei helfen? Ich bin noch sehr neu im Umgang mit Matlab:
Die Abfrage der Anzahl der Messergebnisse und der größe der Messergebnisse würde ich wohl noch hinbekommen, aber ich weiß nicht wie die Schleife aussehen könnte und wie ich jedem Messergebniss eine andere Variable (M1m M2, M3,...,M100) zuordnen kann.

Hoffe ihr könnt mir weiter helfen.

PS: Ich glaube ich kann keine csv Datei in den Anhang legen, daher hab ich einfach mal einen Screenshot der Datei gemacht, damit ihr versteht was ich meine.

Messergebnisse.jpg
 Beschreibung:

Download
 Dateiname:  Messergebnisse.jpg
 Dateigröße:  484.49 KB
 Heruntergeladen:  315 mal
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 19.01.2015, 19:49     Titel:
  Antworten mit Zitat      
Hallo Spidy,

Zum einen: Wenn du die xls zippst, kannst du sie hier hochladen.
Zum anderen: Variablen mit Zähler im Namen sind keine gute Idee, siehe dazu diverse Threads hier im Forum zu eval oder assignin. Stattdessen bieten sich je nach verwendeten und benötigten Daten cells, structs oder mehrdimensionale Matrizen an.

Zum Vorgehen:
Ich würde die gesamte Datei mit
Code:
[num,txt,raw] = xlsread(filename,sheet)
einlesen, dann in der ersten Spalte von txt oder raw nach '% Data' suchen. So kommt man an Indizes mit denen man die benötigten Daten extrahieren kann. Ich denke, das geht dann auch ohne Schleife.

Edit: Falls es bei der Umsetzung Frgen gibt, lade bitte das xls-File hoch. Vorhandene Daten erleichtern es zu helfen.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Spidy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 16.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2015, 20:41     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort.

Ich hab keine xls- sondern eine csv-Datei. Oder gibt es da keinen Unterschied? Natürlich kann ich die csv- in eine xls-Datei umwandeln falls nötig. Ich hab die csv-Datei jetz mal gezippt und hier hochgeladen.

Um ehrlich zu sein, verstehe ich nicht genau wie du mit

Code:
[num,txt,raw] = xlsread(filename,sheet)

das Problem lösen möchtest. Meine Messergebnisse sind nicht auf verschiedene Sheets verteilt, sondern befinden sich alle in einem Sheet. Siehe die Datei im Anhang.

Vielleicht kannst du das etwas konkretisieren?

Grüße,

Spidy Smile

Messwerte.zip
 Beschreibung:
Im Anhang die csv-Datei mit den Messergebnissen.

Download
 Dateiname:  Messwerte.zip
 Dateigröße:  1.16 KB
 Heruntergeladen:  310 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 19.01.2015, 22:29     Titel:
  Antworten mit Zitat      
Hab aus csv irgendwie xls gemacht Embarassed

Gerade wenig Zeit, vllt hilft das schon mal:

Wenn du in xls umwandeln kannst und das Format der Daten immer gleich ist (10 Reihen, beginnend in Zeilen 5, 16, ...), dürfte es so gehen:
Code:
[num, ~, ~] = xlsread('Messwerte.xlsx');
num_data = num(3:end, :);
data = permute(reshape(num_data, 10, size(num_data,1)/10, []), [1 3 2]);

data ist ein 10x10xN-Array mit N=Anzahl der Messergebnisse.

Mit data(:,:,N) kannst du dann auf die einzelnen Messergebnisse zugreifen.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Spidy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 16.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2015, 23:17     Titel:
  Antworten mit Zitat      
Hi Seban,

ich bekomme zwei Fehlermeldungen. Beide sind in der dritten Zeile von deinem Code enthalten:

1) Size arguments must be real integers.

2) Error in: data = permute(reshape(num_data, 10,size(real(num_data),1)/10, []), [1 3 2]);

Um Fehler (1) zu beheben, habe ich es mit real() versucht, aber es klappt nicht. Ich hab eigentlich auch keine imaginären Zahlen, daher verstehe ich Matlabs Problem nicht ganz.

So ganz habe ich die dritte Zeile auch noch nicht verstanden.

Mir ist es wichtig, dass Problem möglichst allgemein zu lösen. Daher lass uns doch bitte mit Variablen arbeiten, damit ich im Quellcode besser erkennen kann, auf was sich der Befehl bezieht.

Variablen:
N= Anzahl der Messergebnisse (in meiner Beispiel-Datei N=3)
Z= Zeile ab der die Daten eingelesen werden (hier Z=4 da ab Null gezählt wird)
G=Größe der Messergebnisse, also in meinem Fall jeweils eine 10x10 Matrix (hier G=10)

Bezogen auf deinen Quellcode, sehe ich z.B noch nicht wo du Z definierst.

Grüße,

Spidy Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 20.01.2015, 03:16     Titel:
  Antworten mit Zitat      
Nutzen wir jetzt eine xlsx? Hast du eine, bei der die daten korrekt importiert werden?
Sind die Messergebnisse immer 10x10 bzw. immer für alle Messergebnisse gleich groß?


Ich habe gerade festgestellt, dass es mit meiner Methode wohl doch nicht klappt. Hab übersehen, dass die Daten nicht korrekt importiert wurden und durch Zufall war num_data 30x10 groß, so dass ich übersehen habe, dass zw. dn Messergebnissen je noch eine Zeile NaN vorhanden ist.
Trotzdem noch ein paar Erklärungen zu deinem Post, hab ich jetzt schon geschrieben und kann evtl hilfreich sein:

Spidy hat Folgendes geschrieben:
ich bekomme zwei Fehlermeldungen. Beide sind in der dritten Zeile von deinem Code enthalten:

1) Size arguments must be real integers.

2) Error in: data = permute(reshape(num_data, 10,size(real(num_data),1)/10, []), [1 3 2]);

Um Fehler (1) zu beheben, habe ich es mit real() versucht, aber es klappt nicht. Ich hab eigentlich auch keine imaginären Zahlen, daher verstehe ich Matlabs Problem nicht ganz.

Ich vermute, das es sich um einen Fehler handelt. 1) gibt an was der Fehler ist, 2) gibt die Codezeile an. Mit real wird hier nicht auf einen Imaginärteil verwiesen. Ein integer ist eine ganzzahlige Zahl. Der Fehler ergibt sich, weil size(num_data,1)/10, in reshape eine Größenangabe, nicht ganzzahlig ist. num war bei mir 32x10, num_data 30x10. Daher ing es bei mir auf.

Zitat:
So ganz habe ich die dritte Zeile auch noch nicht verstanden.

Ich habe dies von hier. Mit reshape kann man Matrizen umformen. Hier wollen wir aus einer 30x10- eine 10x10x3-Matrix erzeugen.
Da reshape spalten- statt zeilenweise vorgeht, müssen wir den Umweg über eine 10x3x10-Matrix gehen. Die erste 10 ist direkt angegeben, die 3 ergibt sich aus der Gesamtzeilenanzahl durch Zeilenanzahl je Messung, die zweite 10 bestimmt Matlab automatisch (-> [] ).
permute formt wandelt die Zwischenmatrix ins gewünschte Format.
Mehr Hilfe zu den beiden Befehlen findet sich in der sehr guten Matlab-Hilfe.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 20.01.2015, 04:02     Titel:
  Antworten mit Zitat      
Jetzt aber:
Code:
G = 10; % Anzahl Zeilen je Messung
Z = 5;  % erste vier Zeilen enthalten keine Messwerte

% Datenimport
T = readtable('Messwerte.csv', 'ReadVariableNames',false, 'TreatAsEmpty', {'% Grid', '% Data'});
A = table2array(T);
% Überflüssige Zeilen entfernen
A = A(Z:end,:);

% Weitere überflüssige Zeilen finden ...
[z, s] = size(A);
hlp = NaN(1, s);
log = false(z, 1);
for ii = 1:z
    log(ii) = isequaln(A(ii,:), hlp);
end
idx = find(log);
% ... und entfernen
A(idx,:) = [];

% Daten umstrukturieren
hlp = reshape(A, G, size(A,1)/G, []);
data = permute(hlp, [1 3 2]);

_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Spidy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 16.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2015, 15:05     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Hilfe!!! Das weiß ich sehr zu schätzten. Matlab ist wirklich interessant. Insbesondere deine letzten beiden Zeilen sind echt tricky. Da wäre ich nicht so schnell drauf gekommen.

Es funktioniert eigentlich alles so wie ich es mir vorgestellt habe. Ich finde es aber etwas komisch, dass ich wenn ich meine von Comsol exportierte csv-Datei auf den Desktop exportiere und sie dann von Matlab importiere um sie danach auszuführen, ich ersteinmal eine Fehlermeldung erhalte (Der Befehl readtable kann nur eine Variable "Var1" lesen). Es stellt sich jedoch heraus, dass ich die csv-Datei einfach noch mal abspeichern muss um die Fehlermeldung zu umgehen. Ich speicher also die csv-Datei mit "Speicher unter..." als csv-Datei ab und danach funktioniert alles ohne Probleme. Ich vermute mal, dass Excel intern dann irgendetwas mit der Datei macht, was Matlab dazu veranlasst keine Fehlermeldung auszugeben.

Würde mich schon interessieren woher der Fehler kommt. Falls jemand dazu etwas weiß, kann er das ja gerne hier mal reinschreiben, ansonsten hake ich mein Problem erstmal als gelöst ab.

Vielen Dank,

Spidy
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 21.01.2015, 14:07     Titel:
  Antworten mit Zitat      
Gern geschehen.

Spidy hat Folgendes geschrieben:
Matlab ist wirklich interessant. Insbesondere deine letzten beiden Zeilen sind echt tricky. Da wäre ich nicht so schnell drauf gekommen.

Ja, es gibt eine Menge nützlicher Funktionen. Einige greift man nach und nach auf, die meisten lernt man vermutlich nie kennen. Außer man arbeitet tagtäglich mit Matlab, aber bestimmt auch dann nicht Very Happy

Zu dem Fehler habe ich keine Idee. Var1, Var2 usw. sind glaube ich die Bezeichner, die readtable den Spalten zuordnet, wenn man keine Kopfzeile einliest. Warum es da meckert, kA. In deiner Datei werden die Begriffe wohl nicht vorkommen, die verschwinden durch bloßes neu speichern ja nicht.

Grüße
_________________

Richtig fragen
Debugging
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.