2013-01-08 7 views
6

Betrachten Sie das folgende:Schreibzellenfeld von kombinierten Strings und numerische Eingabe in Textdatei

DateTime = {'2007-01-01 00:00';'2007-02-01 00:00';'2007-03-01 00:00'}; 
Headers = {'Datetime','Data'}; 
Dat = [100,200,300]; 

Data = [DateTime,num2cell(Dat')]; 
Final = [Headers;Data]; 

Wie würde ich die Daten in ‚Final‘ in eine Registerkarte Textdatei schreiben. Ich weiß, wie man fopen, fprintf usw. benutzt, wenn die Variable nur aus numerischen Eingaben besteht, aber ich kämpfe darum, dieses Problem zu lösen. Ich habe versucht:

fid = fopen('C:\Documents\test.txt','wt'); 
fprintf(fid,'%s\t%s\n',Final{:}); 
fclose(fid); 

Dies generiert jedoch keine Textdatei, die im selben Format wie in Matlab generiert wird. Wie kann dieses Problem gelöst werden?

+0

+1 für den leicht bearbeitbaren Code, den Sie zur Verfügung gestellt – Acorbe

Antwort

6

Diese Lösung liefert, was ich denke, dass Sie brauchen; einige Bemerkungen, die ich hoffe, nützlich zu sein, sind auf Seite

DateTime = {'2007-01-01 00:00';'2007-02-01 00:00';'2007-03-01 00:00'}; 
Headers = {'Datetime','Data'}; 
Dat = [100,200,300]; 


% // In the way you used fprintf it expects just strings ('%s\t%s\n'), 
% // therefore Data should be composed exclusively by them. 
% // Numbers are converted to strings by using num2str 
% // by using cellfun we iteratively convert every element of num2cell(Dat') 
% // in strings, obtaining a cell 
Data = [DateTime,cellfun(@num2str, num2cell(Dat'), 'UniformOutput' , false)]; 
Final = [Headers;Data]; 

fid = fopen('test.txt','wt'); 

% // this iterates fprintf on the cell rows, giving you the output 
cellfun(@(x,y) fprintf(fid,'%s\t%s\n',x,y),Final(:,1),Final(:,2));  
fclose(fid); 

Ergebnis

Datetime Data 
2007-01-01 00:00 100 
2007-02-01 00:00 200 
2007-03-01 00:00 300 

EDIT: (aus den Kommentaren) im allgemeinen Fall einer Zelle N-Spalten können Sie gehen Sie einfach für eine for-Schleife, z

for i = 1 : size(Final,1) 
    fprintf(fid,'%s ', Final{i,:}); 
    fprintf(fid,'\n'); 
end 

(dasselbe Ergebnis, aber nicht abhängig von der Anzahl der Spalten).

+0

Große Antwort, obwohl was passieren würde, wenn das Zell-Array mehr als 2 Spalten haben würde, z. 10 Spalten, würde das Schreiben Final (:, 1), Final (:, 2), Final (:, 3) und so weiter beinhalten. Es muss eine Methode geben, wo dies funktioniert, ohne die einzelnen Spalten zu spezifizieren? – KatyB

+0

@Kate, sicher. In der Tat wickelt cellfun nur eine for-Schleife ab, in diesem Fall für die Zeilen. Was Sie tun können, ist, Ihre eigenen Schleifen für die Spalten zu schreiben. Ich ändere die Antwort für den allgemeinen Fall. – Acorbe

+0

@Kate, bitte schauen Sie. – Acorbe

Verwandte Themen