2010-05-27 31 views
6

Ho 3 file txt s1.txt, s2.txt, s3.txt. Ognuno ha lo stesso formato e numero di dati. Voglio combinare solo la seconda colonna di ciascuno dei 3 file in un unico file. Prima di combinare i dati, mi si è occupata in base alla prima colonna:Come salvare i dati nel file .txt in MATLAB

indifferenziati di file: s1.txt s2.txt s3.txt

1 23  2 33 3 22 
4 32  4 32 2 11 
5 22  1 10 5 28 
2 55  8 11 7 11 

file ordinato: s1.txt s2.txt s3 .txt

1 23  1 10 2 11 
2 55  2 33 3 22 
4 32  4 32 5 28 
5 22  8 11 7 11 

Ecco il codice che ho finora:

BaseFile ='s' 
n=3 
fid=fopen('RT.txt','w'); 
for i=1:n 
    %Open each file consecutively 
    d(i)=fopen([BaseFile num2str(i)'.txt']); 

    %read data from file 
    A=textscan(d(i),'%f%f') 
    a=A{1} 
    b=A{2} 
    ab=[a,b]; 

    %sort the data according to the 1st column 
    B=sortrows(ab,1); 

    %delete the 1st column after being sorted 
    B(:,1)=[] 

    %write to a new file 
    fprintf(fid,'%d\n',B'); 

    %close (d(i)); 

    end  
fclose(fid); 

Come posso ottenere l'output nel nuovo file txt in questo formato?

23 10 11 
55 33 22 
32 32 28 
22 11 11 

anziché questo formato?

23  
55  
32 
22 
10  
33 
32 
11 
11 
22 
28 
11 

risposta

10

Creare prima la matrice di output, quindi scriverlo nel file.

Ecco il nuovo codice:

BaseFile ='s'; 
n=3; 
for i=1:n % it's not recommended to use i or j as variables, since they used in complex math, but I'll leave it up to you 

    % Open each file consecutively 
    d=fopen([BaseFile num2str(i) '.txt']); 

    % read data from file 
    A=textscan(d,'%f%f', 'CollectOutput',1); 

    % sort the data according to the 1st column 
    B=sortrows(A{:},1); 

    % Instead of deleting a column create new matrix 
    if(i==1) 
     C = zeros(size(B,1),n); 
    end 

    % Check input file and save the 2nd column 
    if size(B,1) ~= size(C,1) 
     error('Input files have different number of rows'); 
    end 
    C(:,i) = B(:,2); 

    % don't write yet 
    fclose (d); 

end 

% write to a new file 
fid=fopen('RT.txt','w'); 
for k=1:size(C,1) 
    fprintf(fid, [repmat('%d\t',1,n-1) '%d\n'], C(k,:)); 
end 
fclose(fid); 

EDIT: In realtà scrivere solo i numeri a un file che non è necessario fprintf. Utilizzare DLMWRITE invece:

dlmwrite('RT.txt',C,'\t') 
+0

Grazie molto ... il codice sono così pulito e ordinato e funziona !! :) hai appena fatto la mia giornata! Grazie .. – Jessy

+0

@Jessy: il codice può essere fatto meglio. Non ho prestato molta attenzione alla parte di input. Ad esempio, in realtà non hai bisogno di cell2mat, basta usare il parametro 'CollectOutput' (true) in textscan. Aggiungerei anche il codice di convalida per assicurarmi che tutti i file di input abbiano lo stesso numero di righe (o che il codice non funzioni). – yuk

+0

@Jessy, ho aggiornato il codice quando ho accesso a MATLAB. – yuk

Problemi correlati