2010-05-27 11 views
6

Ich habe 3 TXT-Dateien s1.txt, s2.txt, s3.txt .Jede haben das gleiche Format und die Anzahl der Daten.Ich möchte nur die zweite Spalte von jeder der 3 Dateien in eine Datei zu kombinieren. Bevor ich die Daten kombinieren, ich sortiert sie nach der ersten Spalte:So speichern Sie Daten in. TXT-Datei in MATLAB

unsortierten Datei: 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 

Sortiert Datei: 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 

Hier ist der Code ich habe bisher:

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

Wie kann ich die Ausgabe in der neuen TXT-Datei in diesem Format erhalten?

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

anstelle dieses Formats?

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

Antwort

10

Erstellen Sie zuerst die Ausgangsmatrix, und schreiben Sie sie in die Datei. Hier

ist der neue Code:

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: Eigentlich nur Zahlen in eine Datei schreiben Sie nicht fprintf benötigen. Verwenden Sie DLMWRITE statt:

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

Danke sehr viel ... Code sind so sauber und ordentlich und es funktioniert !! :) Du hast gerade meinen Tag gemacht! Danke .. – Jessy

+0

@Jessy: Der Code kann besser gemacht werden. Ich habe dem Eingangsteil nicht viel Aufmerksamkeit geschenkt. Zum Beispiel brauchen Sie auch nicht cell2mat, verwenden Sie einfach den Parameter 'CollectOutput' (true) in textscan. Ich würde auch Validierungscode hinzufügen, um sicherzustellen, dass alle Eingabedateien die gleiche Anzahl von Zeilen haben (oder der Code wird nicht funktionieren). – yuk

+0

@Jessy, ich habe den Code aktualisiert, als ich Zugang zu MATLAB bekomme. – yuk

Verwandte Themen