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

Strings aus Struct entfernen

 

JimPanse
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2016, 11:17     Titel: Strings aus Struct entfernen
  Antworten mit Zitat      
Hallo!

Ich habe ein relativ simples Anliegen, bekomme es aber einfach nicht auf die Reihe, das ganze zu automatisieren.
Ausgangssituation ist es Struct mit mehreren Ebenen:
Beispiel:

Code:
meinstruct.ebene1.value=5
meinstruct.ebene1.beschreibung='Zahl fuenf'
meinstruct.ebene2.value=2000;
meinstruct.ebene2.value2=100;
meinstruct.ebene2.beschreibung='Text'


Mein eigentliches Struct ist um einiges komplexer, deswegen auch die gewünschte Automatisierung.

Für eine Weiterverarbeitung in einer anderen Software muss ich jetzt aus diesem Struct alle Einträge vom Typ String entfernen.
Hat jemand eine Idee, wie ich das machen kann?

Besten Dank vorab!
Private Nachricht senden Benutzer-Profile anzeigen


huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 13.08.2016, 08:11     Titel:
  Antworten mit Zitat      
Hallo

ich hätte eine Idee, wie man das machen könnte. Aber mir fällt nur eine rekursive Methode ein.
du schreibst dir eine Funktion (Bsp: RmStringFromStruct) und übergibst das struct als Inputparameter.
du holst dir mit fieldnames alle felder des structs und iterierst über die länge der felder.
dann überprüfst du ob jedes feld wieder ein struct ist. falls ja rufst du rekursiv die funktion in der du jetzt bist wieder auf. das ganze diesmal mit dem feld.
also: RmStringFromStruct(meinstruct.ebene1).

Falls das Feld kein struct ist, überprüfst du wieder ob das feld vom typ char ist ischar . falls ja, entfernst du das aktuelle feld in dem struct mit rmfield und schreibst das modifizierte struct zurück.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
JimPanse
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2016, 12:39     Titel:
  Antworten mit Zitat      
Vielen Dank, ich habe das Problem lösen können.
Ich hatte bereits eine Funktion, die mir die Fieldnames rekursiv ausgibt, ich habe es jetzt aber tatsächlich mit dem rekursiven Aufruf gelöst.

Hier meine Lösung, falls jemand ein ähnliches Problem hat:

Code:
function [ my_struct ] = remove_strings( in_struct )

str_names=fieldnames(in_struct);
    for idx=1:numel(str_names)                                             % Schleife über alle Fieldnames der ersten Ebene
        akt_field=['in_struct.', str_names{idx}];
        eval(['charflag=ischar(in_struct.',str_names{idx},');'])            % Flag setzen, wenn aktuelles Element Typ 'Char'
        eval(['structflag=isstruct(in_struct.',str_names{idx},');'])        % Flag setzen, wenn aktuelles Element Typ 'Struct'
        if structflag==1
            evalcommand=[akt_field,'=remove_strings(', akt_field, ');'];   % Rekursiver Aufruf, wenn Element ebenfalls ein Struct ist
            eval(evalcommand);
        elseif charflag==1
            in_struct=rmfield(in_struct, str_names{idx});                    % Löschen, wenn Element vom Typ 'Char' ist
        end
    end
    my_struct=in_struct;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 16.08.2016, 14:28     Titel:
  Antworten mit Zitat      
Hi,

super arbeit. anbei mal mein code nur ohne eval .
Code:
function [outStruct] = RmStringFromStruct(inputStruct)

%% error handling
errStr = 'Input parameter has to be a string';
assert(nargin == 1,errStr);

if(~isstruct(inputStruct))
    error(errStr);
end


%% Algorithmus
fldnames = fieldnames(inputStruct);

for i=1:length(fldnames)
    if(isstruct(inputStruct.(fldnames{i})))
        inputStruct.(fldnames{i}) = RmStringFromStruct(inputStruct.(fldnames{i}));
    else
        if(ischar(inputStruct.(fldnames{i})))
            % Hier folgt die eigentliche Routine, was mit den gefundenen Strings geschehen soll
            % In dem Fall wird das Feld entfernt
            inputStruct = rmfield(inputStruct,fldnames{i});
        end
    end    
end

outStruct = inputStruct;


P.S.: ich entferne alle Felder aus einem (verschachtelten), die vom Typ char sind. Weiterhin hab ich ausschließlich mit dem Beispiel-Struct gearbeitet. ich habe kein Versuch unternommen mit weiteren Ebenen in der Struktur.
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.