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

Tabelle teilen und in xlsx wegschreiben

 

Thob96
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 10.04.2017, 13:22     Titel: Tabelle teilen und in xlsx wegschreiben
  Antworten mit Zitat      
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!

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 10.04.2017, 14:35     Titel:
  Antworten mit Zitat      
Hier zum Beispiel 2 Vergleichsversuche. Ich bin mir nicht sicher ob ich einfach einen Fehler drin habe oder prinzipiell der Vergleich nicht möglich.

Code:

A=importfile2('Daten.csv');
B=sortrows(A,1);
f=unique(B(:,1));
 


Versuch 1:

Code:

C = B(B==f(1,1),:)

Undefined operator '==' for input arguments of type 'table'.
 


Versuch 2:
Code:

B(cell2mat(B.ID)==cell2mat(f.ID(1)))

Error using cat
Dimensions of matrices being concatenated are not consistent.

Error in cell2mat (line 83)
            m{n} = cat(1,c{:,n});
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2017, 15:04     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 10.04.2017, 15:18     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort.

Ein Problem bei dem Vergleich habe ich:

Code:

[for i=1:height(f)
    for j=1:height(B)

        if B.ID{j}==f.ID{i}
        a=a+1; %Platzhalter
        end
   
    end
end]

Matrix dimensions must agree.

Error in Zeilenanzahl (line 23)
        if B.ID{j}==f.ID{i}
 


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?

Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2017, 15:29     Titel:
  Antworten mit Zitat      
Hallo,

die erste Spalte ist ID? Dann so:

Code:
A=importfile2('Daten.csv');
B=sortrows(A,1);
f=unique(B.ID);
for k = 1:numel(f)
partK = B(B.ID == f(k), :);
% Verarbeiten von partK
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 10.04.2017, 15:44     Titel:
  Antworten mit Zitat      
Das ist fast zum Verzweifeln..

Code:

Undefined operator '==' for input arguments of type 'cell'.

Error in Zeilenanzahl (line 30)
partK = B(B.ID == f(k), :);
 


B value ist 2320x18 table und f value ist 116x1 cell. Die ID habe ich als Text in der ersten Zeile importiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2017, 16:05     Titel:
  Antworten mit Zitat      
Hallo,

ich wusste nun mal nicht, welches Format deine Daten genau haben.
Sind die Daten in f alles Strings? Dann:

Code:
partK = B(strcmp(B.ID, f{k}), :);


Wenn du Beispieldaten (und die importfile2) zur Verfügung stellen kannst, macht es das viel leichter.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 10.04.2017, 16:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke, mit deinem Hinweis funktioniert es.

Code:

for k = 1:numel(f)
partK = B(strcmp(B.GebID, f{k}), :);
x=strcat(f{k},'.xlsx');
writetable(partK,x);
end
 


Meine nächsten Ziele sind:

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.

Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2017, 18:08     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Nur die ID's beginnend mit 3**** wegzuschreiben

Also erste Stelle 3? Dann
Code:
if f{k}(1) == '3'


Zitat:
nur bestimmte Spalten

dann statt partK
Code:
partK(:, spalten)

z.B.
Code:
partK(:, {'ID', 'Wert'})


Zitat:
die xlsx durch eine append Funktion zu erweitern,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 11.04.2017, 08:49     Titel:
  Antworten mit Zitat      
Guten Morgen,

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.

Code:

clear all
clc

for i=7:9
dname=strcat('Messdaten\BB 1 2016-12-0',num2str(i),'.csv.last');
A=importfile2(dname);
B=sortrows(A,1);
f=unique(B.ID);

for k = 1:numel(f)
    if f{k}(1) == '3'
    partK = B(strcmp(B.ID, f{k}), :);
    K{k}=[K{k};partK];

    end
end
end

for k = 1:numel(f)
    if f{k}(1) == '3'
    x=strcat(f{k},'.xlsx');
    writetable(K{k}(:,{'ID','Datum','Zeit','Breite','Laenge','Hohe'}),x);
   
    end
end
 


1. mit K=cell(1) kommt:

Code:

clear all
clc
K=cell(1);

for i=7:9

...

Index exceeds matrix dimensions.

Error in Zeilenanzahl (line 14)
        K{k}=[K{k};partK];
 



2. ohne K anfangs zu definieren:

Code:

clear all
clc

for i=7:9

...

Undefined variable "K" or class "K".

Error in Zeilenanzahl (line 14)
        K{k}=[K{k};partK];
 


Kann ich das Problem irgendwie geschickt umgehen?

Grüße,
ThoB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2017, 10:49     Titel:
  Antworten mit Zitat      
Hallo,

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

Code:

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 11.04.2017, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

genau das hat gefehlt. Jetzt funktioniert es. Wieder einmal danke Harald.

Code:

clear all
clc

for k =1:150
K{k}=table();
end;

for i=7:9
dname=strcat('Messdaten\1 2016-12-0',num2str(i),'.csv.last');
A=importfile2(dname);
B=sortrows(A,1);
f=unique(B.ID);

for k = 1:numel(f)
    if f{k}(1) == '3'
    partK = B(strcmp(B.ID, f{k}), :);
    K{k}=[K{k};partK];

    end
end
end

for k = 1:numel(f)
    if f{k}(1) == '3'
    x=strcat(f{k},'.xlsx');
    writetable(K{k}(:,{'ID','Datum','Zeit','Breite','Laenge','Hohe'}),x);
   
    end
end
 


Ein weiteres Problem hat sich jetzt für mich ergeben: Die eingelesenen Messdaten haben nicht immer dieselbe Bezeichnung. Beispiel:


Um einfach alle Messdaten einzubeziehen, dachte ich mir, mittels Schleife alle einmal einzulesen und in den K{k} Puffer zu schreiben:

Code:

for i=0:9
dname=strcat('Messdaten\1 2016-12-1',num2str(i),'.csv.processed');
    A=importfile2(dname);
...

for i=0:9
dname=strcat('Messdaten\1 2016-12-1',num2str(i),'.csv.last');
    A=importfile2(dname);
...

for i=0:9
dname=strcat('Messdaten\1 2016-12-1',num2str(i),'.csv.1.processed');
    A=importfile2(dname);
...

 


Dabei gibt es nun folgende Probleme:

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.


Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2017, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

zu 1.:
Sauberer wäre, mit exist zu testen.

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?

zu 3.:
Code:


Möglicherweise hilft auch der dir-Befehl.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 12.04.2017, 12:54     Titel:
  Antworten mit Zitat      
Hallo Harald,

ein erneutes Mal vielen Dank für deine Tipps.

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.

Code:


clear all
clc
 
for k =1:150
K{k}=table();
end;

dateien=dir('Messdaten\November2016');
laenge=size(dateien,1);

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];

            end
        end
    else
    end
end

K{1}=sortrows(K{1},[2,3]);


x=strcat('November2016','.xlsx');
writetable(K{k}(:,{'ID','Datum','Zeit','Breite','Laenge','Hohe'}),x);
   
 


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
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.