Verfasst am: 02.06.2014, 11:49
Titel: structure aus importierten cellarray erzeugen
Hallo, ich importiere aus einem excelfile eine Tabelle die als structure gespeichert werden muss. Zusätzlich wird eine Abfrage auf ausgeführt ob alles importiert werden soll (ist hier aber nicht so wichtig). Das ganze funktioniert im Moment über den eval-Befehl, was entsprechend langsam ist. Leider ist mir keine Möglichkeit eingefallen das ganze sauberer zu lösen. An die Funktion wird folgendes übergeben:
- this.NodeList: doublearray
- raw: Rohdaten aus dem import
- txt: ein cellArray aus dem import bei dem viele felder leer sind (ähnlich einem strukturbaum
- Prop_txt: weitere Daten aus dem import bei dem u.a. die NodeList verglichen wird
Meine Schwierigkeit ist, die Strings aus der cellArray txt als fieldnames des zu erzeugenden structs struktur in einer sauberen Weise zu überführen. Ich habe eine Schleife die zuerst durch die Spalten und anschließend durch die Zeilen geht um entsprechend die fieldnames anzuordnen, aber bisher wird dies nur als string gespeichert. Eine Beispieltablle sieht so aus:
erste_Spalte
.................zweite_Spalte
.................noch_ein_Wert.....ein_Wert
...........................................zweiter_Wert
Das hieraus erzeugte struct wäre z.B. erste_Spalte.noch_ein_Wert.zweiter_Wert oder erste_Spalte.zweite_Spalte
Hoffe es ist einigermaßen verständlich.
meine Funktion sieht im Moment folgendermaßen aus:
Code:
function struktur = create_Struktur(this, raw, txt, Prop_txt)
% sucht beide spalten nodenumbers for i=1:length(raw(1,:)) if strncmpi(raw{1,i},'nodenumbers',11)
RSC=i; % RangeStartColumn
REC=i+1;% RangeEndColumn break end end % nodes zu gruppen zusammenfassen
Groups_Nodes_temp=cell(num_row,1);
for j=2:num_row
if ~isnan(raw{j,RSC}) if raw{j,RSC}<=raw{j,REC}
lNodesIndex = raw{j,RSC}<= this.NodeList & this.NodeList <= raw{j,REC}; % welche nodes sind in den spalten die gleichzeitg in NodeList
Groups_Nodes_temp{j,1}=this.NodeList(lNodesIndex); % speichern der zuvor gefundenen nodenumber(s) als gruppe end end end
k = 1;
quantity = length(num_Layer);
% alle Spalten der struktur von hinten bis zur zweiten % durchgehen for first = num_Layer:-1:2 for i = num_row:-1:2 if ~isempty(txt{i,first}) if ~isempty(Prop_txt{i,6}) for l=1:length(Groups_Nodes_temp{i,1})
nameofstruct{k} = [txt{i,first} '.Node_' num2str(Groups_Nodes_temp{i,1}(l)) '=[]'];
for j = first:-1:2
i_temp = i;
while(isempty(txt{i_temp-1,j-1}) && (i_temp ~= 0) && (j ~= 0))
i_temp = i_temp-1;
end
nameofstruct{k} = strcat(txt{i_temp-1,j-1},'.',nameofstruct{k});
end
k = k + 1;
end else
nameofstruct{k} = txt{i,first};
for j = first:-1:2 while(isempty(txt{i-1,j-1}) && (i ~= 0) && (j ~= 0))
i = i-1;
end
nameofstruct{k} = strcat(txt{i-1,j-1},'.',nameofstruct{k});
end
k = k + 1;
end end end end
nameofstruct = sort(nameofstruct);
k = 1;
quantity = size(nameofstruct,2);
for i=1:quantity
ifstrfind(nameofstruct{i},'=') eval([nameofstruct{i} ';']);
else eval([nameofstruct{i} '=[];']);
k = k + 1;
end end
struktur = eval(txt{1,1}); % endgültige erzeugung der struktur end
Dein Code sieht schon recht kompliziert aus, um den nachvollziehen zu können. Vielleicht kannst du deine Cells(Funktion-Eingangsparameter) als Mat-Datei hier anhängen.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.06.2014, 17:24
Titel:
habe die workspacevariablen angehängt (.rar einfach löschen, da .mat hier nicht erlaubt is hochzuladen). Ist ein sehr einfaches Beispiel. Letztlich soll es wie das ergebnis-struct sein.
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.