Verfasst am: 10.04.2017, 13:22
Titel: Tabelle teilen und in xlsx wegschreiben
Guten Tag,
ich habe mir mittels Matlab Messdaten eingelesen und möchte sie nun gerne sortieren und einzeln in Excel-Dateien .xlsx wegschreiben.
Aufbau der aktuellen eingelesenen Tabelle in Matlab ist:
A =
ID ___ Messdaten
111__ x
111__ y
222__ z
222__ a
222__ b
333__ c
333__ d
Mein Ziel ist es nun diese Tabelle erst einmal aufzuteilen in folgende Einzeltabellen, da ich dann meiner Meinung nach einfacher alles auf einmal wegzuschreiben kann.
ID ___ Messdaten
111__ x
111__ y
ID ___ Messdaten
222__ z
222__ a
222__ b
ID ___ Messdaten
333__ c
333__ d
Bislang gelang es mir über writetable die gesamten Messdaten in eine xlsx-Datei zu schreiben, doch Ziel ist es für jede ID eine eigene xlsx-Datei zu haben. Oder zumindest in verschiedene Sheets zu schreiben. Deshalb benötige ich Hilfe bei der Teilung.
Über f = unique(A(:,1)) besitze ich eine Tabelle mit den einzelnen ID's. Mit welchem Befehl könnte ich jetzt über einen Vergleich von f und A die Tabelle nach meinen Wünschen teilen? Simple Vorschleife mit Vergleich oder gibt es in Matlab schon eine Tabellen Teil-Funktion? Mir fehlt leider der Überblick der Matlab-Befehle um so wissen, welche meiner Vorstellungen ich auch Umsetzten kann. Für jeden Denkanstoß bin ich dankbar!
eine for-Schleife mit logischer Indizierung dürfte das einfachste sein.
Du musst lediglich darauf achten, dass du wirklich den Inhalt des Tables herausholst, also Indizierung mit { } oder am besten . wenn du ohnehin nur eine Spalte herausholst.
Liegt das daran, dass nicht alle ID dieselbe Länge haben? Zum Beispiel gibts 111 und 111_03 als ID-Einträge. Kann der Vergleich durch eine Umwandlung in vielleicht str oder etwas anderem umgangen werden?
1. Nur die ID's beginnend mit 3**** wegzuschreiben sowie nur bestimmte Spalten
und
2. die xlsx durch eine append Funktion zu erweitern, da es sich pro Tabelle B nur um einen Tag handelt und ich die Messdaten für einen Monat oder mehr von einer ID in einer xlsx Datei haben möchte. Scheinbar funktioniert dafür append nicht direkt mit writetable.
Dafür werde ich erstmal wieder googlen anstrengen und melde mich später sehr wahrscheinlich bei Fragen wieder.
Nochmals danke Harald, das hat mich schon sehr viel weiter gebracht.
Was meinst du damit? Dass Daten untereinandergeschrieben werden sollen? Dann ist es einfacher, wenn du die Daten innerhalb von MATLAB sammelst und dann zusammen schreibst.
danke für die vielen Hinweise Harald.
Das meiste davon konnte ich umsetzen. Nur das schreiben der Daten in ein cell Array, um sie später in Excel zu exportieren, funktioniert leider noch nicht richtig.
Habe bereits versucht K=cell() oder K=cell(1) anfangs in der dritten Zeile hinter clc zu schreiben, damit K{} später nicht als "leer" angesehen wird, doch ein Fehler tritt immer wieder auf.
wenn du einen Table dranhängen willst, müsste das auch als leerer Table initialisiert sein. Stimmt denn der Index? Intuitiv hätte ich gesagt, es muss
K{i}
sein, also
1. Manche dieser generierten Dateinamen gibt es nicht. Kann ich Matlab sagen: "Dann überspringe den Schritt und machte mit dem Rest weiter"?
2. Manche Dateien wie zum Beispiel "1 2016-12-16.csv.processed" und "1 2016-12-16.csv.last" besitzen den selben Dateninhalt. Diese werden nun doppelt in meine K{k} Tabelle geschrieben. Kann ich irgendwie sicherstellen, dass ein doppeltes Eintragen derselben Datenzeile aus beiden Messdatein vermieden wird?
3. Kann auch i=01:31 umgesetzt werden um ggf direkt einen ganzen Monat einzulesen? Bislang wird aus i immer wieder 1 satt 01.
(obwohl das lässt sich wohl lösen durch if i<10 dann das, if 9<i<20 dann das, etc...)
Ich weiß das ist eine Menge auf einmal. Für jeder Antwort bin ich wieder dankbar.
zu 2.:
Das wäre mühsam. Einfacher wäre vermutlich, das doppelte Einlesen zu vermeiden. Kannst du beispielsweise sagen, dass zu jedem Datum nur die zuletzt gespeicherte Datei gelesen werden soll?
Das doppelte Einlesen habe ich jetzt erstmal manuell gelöst, pro Tag waren es meist 2-4 Dateien und anhand der Größe habe ich sie täglich auf 2 reduziert, sodass 24 Stunden abgedeckt sind ohne Daten doppelt zu haben. Werde erstmal damit leben, da es eine Sache von wenigen Minuten ist.
Die Idee mit dem "dir"-Befehl war klasse. So konnte ich Problem 1 und 3 gleich gemeinsam lösen.
Die Abfrage mit "== '1'" musste ich einbauen, da die ersten beiden "dir"-Zeilen immer "." und ".." als Dateinamen ausgeben.
for i=1:laenge
if dateien(i).name(1) == '1'
dname=strcat('Messdaten\November2016\',dateien(i).name);
A=importfile2(dname);
B=sortrows(A,3); % Mittlerweile überflüssig, sortiere am Ende noch einmal.
f=unique(B.ID);
for k = 1:numel(f) if f{k}(1) == '3'
partK = B(strcmp(B.ID, f{k}), :);
K{1}=[K{1};partK];
Somit kann ich mir nur meine Messdaten für jeweils einen Monat ausgeben. Falls mir neue Ideen zur Erweiterung einfallen, melde ich mich wieder. Doch das erst nach Ostern.
Wünsche Euch allen ein Frohes Osterfest.
Grüße,
Thob
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.