2013-01-08 8 views
6

Rozważmy następujący:zapisu array komórką połączeniu ciągiem liczbowym i wejście do pliku tekstowego

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]; 

Jak chciałbym napisać dane w „Finał” na karcie rozdzielany plik tekstowy. Wiem, jak używać fopen, fprintf i tak dalej, gdy zmienna składa się wyłącznie z danych liczbowych, ale staram się rozwiązać ten problem. Próbowałem:

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

Jednak nie generuje to pliku tekstowego w formacie wygenerowanym w programie Matlab. W jaki sposób można rozwiązać ten problem?

+0

+1 za łatwo działający kod podany – Acorbe

Odpowiedz

6

To rozwiązanie daje to, czego myślę, że potrzebujesz; Kilka uwag, które mam nadzieję być przydatne są na stronie

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); 

wynik

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

EDIT: (z komentarzami) w ogólnym przypadku komórki N-kolumn, można po prostu wybierz pętlę for, np

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

(ten sam wynik, ale nie w zależności od liczby kolumn).

+0

Świetna odpowiedź, chociaż co by się stało, gdyby tablica komórek miała więcej niż 2 kolumny, np. 10 kolumn, obejmowałoby pisanie Final (:, 1), Final (:, 2), Final (:, 3) i tak dalej. Musi istnieć metoda, w której to działa bez określania poszczególnych kolumn? – KatyB

+0

@ Kate, jasne. Rzeczywiście to, co robi cellfun, to po prostu pętla for, w tym przypadku dla wierszy. Możesz też napisać własne pętle zawierające również kolumny. Zmieniam odpowiedź na ogólny przypadek. – Acorbe

+0

@Kate, proszę spojrzeć. – Acorbe

Powiązane problemy