Verfasst am: 12.08.2016, 11:17
Titel: Strings aus Struct entfernen
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:
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?
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.
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:
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
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
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.
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.