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

Structs in einem Objekt durchsuchen

 

stempf
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 27.01.2021, 12:33     Titel: Structs in einem Objekt durchsuchen
  Antworten mit Zitat      
Hallo Zusammen!

ich habe folgendes Problem:

Ich habe ein Objekt mit x Einträgen und jeder dieser Einträge ist wie in dem Bild im Anhang aufgebaut. Der Aufbau ist aus verschiedenen Structs und diese Structs haben unterschiedliche Table mit einträgen.

Ich würde jetzt gerne das Struct Equip wie folgt durchsuchen:

Jeder Table im Struct Equip soll nach den Zahlen 1 , 2 , 3 , 4 durchsucht werden und falls eine Bedingung richtig ist soll der Name des Table gespeichert werden.

z.B.: u(1).equip durchsuchen in welchem Table eine 1 steht
-> falls der Table vvg_knx eine 1 hat soll er gespeichert bzw. ausgegeben werden.

Bisher habe ich noch keinen sinnvollen Ansatz gefunden. Ich muss das struct durchsuchen ohne die Felder des Struct anzugeben weil diese felder Sich in jedem Struct in den weiteren Einträgen in dem Objekt unterscheiden können.

Wäre cool wenn einer einen Ansatz für mich hätte.

Grüße

Bildschirmfoto 2021-01-27 um 11.21.27.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2021-01-27 um 11.21.27.png
 Dateigröße:  164.43 KB
 Heruntergeladen:  240 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

in einem Struct einen 1x1-Table abzulegen erscheint mir stark übertrieben. Warum nicht einfach die Zahl ablegen?

Um Felder iterativ zu durchsuchen kann die Funktion fieldnames hilfreich sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 11:52     Titel:
  Antworten mit Zitat      
Hallo,

ich will nicht die Inhalte ausgeben sondern die Namen der Felder wie z.B: "vvg_knx".

Ich habe im Anhang zwei Bilder wo ich die Feldernamen in eine Excel Datei schreiben will mit der Funktion Writetable. In den Bilder sieht man im Command window das die Feldernamen ausgegeben werden aber nicht mit dem Befehl writetable in die Excel geschrieben werden.

Leider kommt dort immer der Fehler : "Parameter name must be text."

Kann mir da einer helfen?
Hier noch der Code:

Code:
function [] = test_struct(obj)
% funktion für speichern der structs.

l_object = size(obj); % Anzahl der Produkte in dem Objekt
l_object = l_object(l_object~=1); % Die erste Stelle "1" wird gelöscht

for j=1: l_object
   
if isempty(fieldnames(obj(j).equip)) == 0
fldNames = fieldnames(obj(j).equip);
for i=1:length(fldNames)
         
          %disp(fldNames{i});
          x = cell2table(fldNames);
          writetable(x, 'Ausgabe.xlsx',1, ['A' num2str(i)]);
         
end
end
end

end


Bildschirmfoto 2021-02-01 um 10.47.40.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2021-02-01 um 10.47.40.png
 Dateigröße:  190.61 KB
 Heruntergeladen:  216 mal
Bildschirmfoto 2021-02-01 um 10.47.12.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2021-02-01 um 10.47.12.png
 Dateigröße:  179.19 KB
 Heruntergeladen:  211 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bei Problemen mit einem Befehl kann ich generell nur dazu raten, erst mal die Doku zu lesen. Hier sieht man dann, dass du writetable wie xlswrite nutzt; writetable hat aber eine ganz andere Schnittstelle.

Statt
Code:
         x = cell2table(fldNames);
          writetable(x, 'Ausgabe.xlsx',1, ['A' num2str(i)]);

erscheint mir folgendes sinnvoller:
Code:
         x = fldNames{i};
          xlswrite('Ausgabe.xlsx',x, 1, ['A' num2str(i)]);


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 12:39     Titel:
  Antworten mit Zitat      
Habe ich schon versucht aber mit xlswrite gibt der auch einen Fehler aus:

Code:
Error using xlswrite (line 194)
An error occurred on data export in CSV format.

Error in test_struct (line 16)
          xlswrite('Ausgabe.xlsx',x, 1, ['A' num2str(i)]);

Caused by:
    Error using dlmwrite (line 104)
    The input cell array cannot be converted to a matrix.



Code:
writetable(x, 'Ausgabe.xlsx');

Wenn ich so mit writetable arbeite gibt der mir nur das letzte feld in die Excel aus.
Man muss doch iwie nach jedem durchlauf der for schleife in die nächste Excel zeile schreiben könne...
in der beschreibung der Funktion writetable finde ich keine passende Lösung des problems

Danke für die antworten

Bildschirmfoto 2021-02-01 um 11.36.00.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2021-02-01 um 11.36.00.png
 Dateigröße:  166.08 KB
 Heruntergeladen:  206 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2021, 12:55     Titel:
  Antworten mit Zitat      
Hallo,

dann versuch mal
Code:
x = fldNames(i); % Cell statt Inhalt
xlswrite('Ausgabe.xlsx',x, 1, ['A' num2str(i)]);


Wenn du eine tatsächliche Beispieldatei / -variable anhängst statt eines Screenshots, dann probiere ich meine Vorschläge auch gerne aus. Das ist dann effizienter als mehrmaliges Hin und Her.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 13:06     Titel:
  Antworten mit Zitat      
Code:
x = fldNames(i); % Cell statt Inhalt
xlswrite('Ausgabe.xlsx',x, 1, ['A' num2str(i)]);


Habe ich so probiert, jetzt läuft die Funktion ab aber lieder erscheint nichts in der Excel datei

Gibt es evtl. die alternative mit writetable zu arbeiten? weil dort zumindest in die Exceldatei geschrieben wird
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

sicher gibt es die, ist aber umständlicher. Sinnvoller erscheint mir zu untersuchen, warum mit xlswrite nichts geschrieben wird. Nochmal:
Zitat:
Wenn du eine tatsächliche Beispieldatei / -variable anhängst statt eines Screenshots, dann probiere ich meine Vorschläge auch gerne aus.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 13:11     Titel:
  Antworten mit Zitat      
Ja dann müsste ich eine Beispieldatei mal erstellen.

Matlab gibt eine Warnung raus vielleicht liegt darin das Problem:

Code:
Warning: Could not start Excel server for export.
XLSWRITE will attempt to write file in CSV format.
> In xlswrite (line 181)
  In test_struct (line 16)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 13:14     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

sicher gibt es die, ist aber umständlicher. Sinnvoller erscheint mir zu untersuchen, warum mit xlswrite nichts geschrieben wird. Nochmal:
Zitat:
Wenn du eine tatsächliche Beispieldatei / -variable anhängst statt eines Screenshots, dann probiere ich meine Vorschläge auch gerne aus.


Grüße,
Harald



Reichen die beiden Dateien aus? einmal die Funktion und einmal das Objekt das in dieser Funktion eingelesen wird.

matlab.mat
 Beschreibung:

Download
 Dateiname:  matlab.mat
 Dateigröße:  19.48 KB
 Heruntergeladen:  195 mal
test_struct.m
 Beschreibung:

Download
 Dateiname:  test_struct.m
 Dateigröße:  737 Bytes
 Heruntergeladen:  204 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2021, 13:20     Titel:
  Antworten mit Zitat      
Hallo,

in dem Fall leider nicht:
Zitat:
Warning: Variable 'z' originally saved as a items cannot be instantiated as an
object and will be read in as a uint32.

Man braucht wohl die Klassendefinitionsdatei.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 13:24     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

in dem Fall leider nicht:
Zitat:
Warning: Variable 'z' originally saved as a items cannot be instantiated as an
object and will be read in as a uint32.

Man braucht wohl die Klassendefinitionsdatei.

Grüße,
Harald


items.m
 Beschreibung:

Download
 Dateiname:  items.m
 Dateigröße:  2.29 KB
 Heruntergeladen:  197 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2021, 13:38     Titel:
  Antworten mit Zitat      
Hallo,

bei mir funktioniert dieser Code:
Code:
function [] = test_struct(obj)
% funktion für speichern der structs.

l_object = size(obj); % Anzahl der Produkte in dem Objekt
l_object = l_object(l_object~=1); % Die erste Stelle "1" wird gelöscht

for j=1: l_object
   
if isempty(fieldnames(obj(j).equip)) == 0
fldNames = fieldnames(obj(j).equip);
for i=1:length(fldNames)
         
          %disp(fldNames{i});
          x = fldNames(i); % wie gesagt!!
          %writetable(x, 'Ausgabe.xlsx');
          xlswrite('AusgabeNeu.xlsx',x, 1, ['A' num2str(i)]);
         
end
end
end


Allerdings wird die Ausgabe in jeder j-Iteration überschrieben. Wie sollen denn die Outputs verschiedener Elemente kombiniert werden? Wenn sie einfach nur untereinander geschrieben werden sollen:
Code:
function [] = test_struct(obj)
% funktion für speichern der structs.

l_object = length(obj); % Anzahl der Produkte in dem Objekt

flds = cell(0,1);
for j=1: l_object
   
    if isempty(fieldnames(obj(j).equip)) == 0
        fldNames = fieldnames(obj(j).equip);
       
        flds = [flds; fldNames];
       
    end
end
xlswrite('AusgabeNeu.xlsx',flds, 1);


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 13:48     Titel:
  Antworten mit Zitat      
Ja erstmal untereinander wäre schon sehr Hilfreich.

Ich habe eine andere Ausgabefunktion wo die vorherigen Structs in eine Excel geschrieben werde:

Code:
function [x] = ausgabe(obj)
%% Diese Funktion speichert ein Objekt in eine Exceldatei
l_object = size(obj); % Anzahl der Produkte in dem Objekt
l_object = l_object(l_object~=1); % Die erste Stelle "1" wird gelöscht
x = cell2table ({}); % Leeren Table erstellen

for j=1 : l_object
    % Objekt preis_products in Table speichern
    x(j,1) = obj(j).product.aktor;
    x(j,2) = obj(j).product.hersteller;
    x(j,3) = obj(j).product.bezeichnung;
    x(j,4) = obj(j).product.preis;
    % Hier sollen dann die Felder von equip folgen
 end
    writetable(x,uigetfile('*.xlsx')); % Table x in eine Excel datei schreiben

end


Am besten wäre es wenn nach " x(j,4) = obj(j).product.preis" in eine Neue Zeile geschrieben wird mit den elementen aus equip.




Trotzdem Funktioniert meine ausgabe nicht. Auch nicht mit Ihrem angepassten Code.

Fehler:

Code:
Warning: Could not start Excel server for export.
XLSWRITE will attempt to write file in CSV format.
> In xlswrite (line 181)
  In test_struct (line 17)
Error using xlswrite (line 194)
An error occurred on data export in CSV format.

Error in test_struct (line 17)
xlswrite('AusgabeNeu.xlsx',flds, 1);

Caused by:
    Error using dlmwrite (line 104)
    The input cell array cannot be converted to a matrix


kann das an meiner Matlab version liegen? benutze 2017a
Private Nachricht senden Benutzer-Profile anzeigen
 
stempf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 19.12.20
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 01.02.2021, 14:30     Titel:
  Antworten mit Zitat      
Code:
function [y] = test_struct(obj)
% funktion für speichern der structs.


l_object = length(obj); % Anzahl der Produkte in dem Objekt

flds = cell(0,1);
for j=1: l_object
   
    if isempty(fieldnames(obj(j).equip)) == 0
        fldNames = fieldnames(obj(j).equip);
       
        flds = [flds; fldNames];
       
    end
end
y = cell2table(flds);
%disp(flds);
writetable(y,uigetfile('*.xlsx'));

     
end


Habe es jetzt erstmal so gelöst. jetzt werden die Feldnamen in eine Excel gespeichert
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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