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

Verschachteltes cell array als csv exportieren

 

gomar
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2014, 09:36     Titel: Verschachteltes cell array als csv exportieren
  Antworten mit Zitat      
Guten Morgen!

ich habe ein Cell-Array, dessen Einträge wiederrum Cell-Arrays sind:
Code:

>>F
F =
[49x1 double]   [49x1 double]   [49x1 int]   {49x1 cell}   {49x1 cell}
[74x1 double]   [74x1 double]   [74x1 int]   {74x1 cell}   {74x1 cell}
[129x1 double] [129x1 double] [129x1 int] {129x1 cell} {129x1 cell}
 

Das möchte ich gerne als .csv Datei abspeichern.

Mein Ansatz:
Code:

[row, col] = size(F);
fid = fopen('Test.csv', 'w')
for i = 1: row
fprintf(fid, '%d%d%n%s%s\r\n', F{i, 1:5})
end
fclose(fid);
 

Allerdigs gibt es dann eine Fehlermeldung, fprintf sei nicht für 'cell' inputs definiert.
Muss ich F einfach anders indizieren, oder führt fprintf allgemein nicht zum Ziel?

gomar
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 01.10.2014, 12:02     Titel:
  Antworten mit Zitat      
Hallo

das Problem ist, dass in der Cell weitere Arrays mit unterschiedliche Formaten stecken. Wäre nur ein Wert pro eine Zelle, würde es mit FPRINTF gehen.

Also muss man erstmals umformen:
Code:

F = { round(rand(49,1)*100), round(rand(49,1)*100), int8(round(rand(49,1)*100)), repmat({'test1'},49,1), repmat({'test2'},49,1);...
   round(rand(74,1)*100), round(rand(74,1)*100), int8(round(rand(74,1)*100)), repmat({'test1'},74,1), repmat({'test2'},74,1)}


[row, col] = size(F);
fid = fopen('Test.csv', 'w')
for i = 1: row
   
% zu Matrix fassen
   zahlen =  [F{i, 1:3}];
   str    = [ F{i, 4:5}];
   % zu Cell Matrix umformen
   zahlen = num2cell(zahlen);
   % Strings und Zahlen zusammenfassen
   c      = [zahlen, str]';
   fprintf(fid,'%d,%d,%d,%s,%s\r\n', c{:} );
end
fclose(fid);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
gomar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2014, 16:18     Titel:
  Antworten mit Zitat      
Danke für die Antwort! Das hat mir weitergeholfen Smile
Der Zeichentrenner in Test.csv ist offensichtlich das Leerzeichen:
Gibt es eine Möglichkeit das auf ';' zu ändern?
Code:

...
fprintf(fid,'%d,%d,%d,%s,%s\r\n', 'delimiter', ';', c{:} );
...
 

wollte bei mir nicht funktionieren.

Gruß, Gomar!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 02.10.2014, 14:54     Titel:
  Antworten mit Zitat      
Hallo
nein so was ist mit fprintf nicht möglich,
du kannst entweder das Trennzeichen zwischen Format-Parametern direkt setzen oder einen umweg machen über sprintf
Möglichkeit1:(direkt angeben)
Code:


F = { round(rand(49,1)*100), round(rand(49,1)*100), int8(round(rand(49,1)*100)), repmat({'test1'},49,1), repmat({'test2'},49,1);...
   round(rand(74,1)*100), round(rand(74,1)*100), int8(round(rand(74,1)*100)), repmat({'test1'},74,1), repmat({'test2'},74,1)}

[row, col] = size(F);
fid = fopen('Test.csv', 'w')
for i = 1: row
   
% zu Matrix fassen
   zahlen =  [F{i, 1:3}];
   str    = [ F{i, 4:5}];
   % zu Cell Matrix umformen
   zahlen = num2cell(zahlen);
   % Strings und Zahlen zusammenfassen
   c       =  [zahlen, str]';
   % direkt delimiter zw Formaten angeben
   fprintf(fid, '%d;%d;%d;%s;%s\r\n', c{:} );
end
fclose(fid);
 





Möglichkeit 2: (sprintf Umweg)
Code:


F = { round(rand(49,1)*100), round(rand(49,1)*100), int8(round(rand(49,1)*100)), repmat({'test1'},49,1), repmat({'test2'},49,1);...
   round(rand(74,1)*100), round(rand(74,1)*100), int8(round(rand(74,1)*100)), repmat({'test1'},74,1), repmat({'test2'},74,1)}

delimiter = ';';

[row, col] = size(F);
fid = fopen('Test.csv', 'w')
for i = 1: row
   
% zu Matrix fassen
   zahlen =  [F{i, 1:3}];
   str    = [ F{i, 4:5}];
   % zu Cell Matrix umformen
   zahlen = num2cell(zahlen);
   % Strings und Zahlen zusammenfassen
   c       =  [zahlen, str]';
   % für delimiter Platz reservieren, also %%1$s
   output = sprintf('%d%%1$s%d%%1$s%d%%1$s%s%%1$s%s\r\n', c{:} );
   % und nun in Datei schreiben.
   fprintf(fid, output, delimiter)
end
fclose(fid);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
gomar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2014, 09:12     Titel:
  Antworten mit Zitat      
Hallo!
nochmals vielen Dank!
Ich habe jetzt die Möglichkeit 1 verwendet, und das Programm macht genau was es soll.
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.