2010-05-27 13 views
6

Mam 3 pliki txt s1.txt, s2.txt, s3.txt. Każdy ma taki sam format i liczbę danych. Chcę połączyć tylko drugą kolumnę każdego z 3 plików w jeden plik. Przed Łączę dane, ja sortowane to według 1 kolumna:Jak zapisać dane w pliku .txt w MATLAB

nieposortowane pliku: 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 

Sort file: 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 

Oto kod mam tak daleko:

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

Jak mogę uzyskać dane wyjściowe w nowym pliku txt w tym formacie?

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

zamiast tego formatu?

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

Odpowiedz

10

Najpierw należy utworzyć macierz wyjściową, a następnie zapisać ją w pliku.

Oto nowy kod:

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: Właściwie napisać tylko numery do pliku nie trzeba fprintf. Użyj DLMWRITE zamiast:

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

.Thank Ci bardzo ... Twój kod jest tak czysty i schludny i to działa !! :) Właśnie ułożyłeś mój dzień! Dziękuję .. – Jessy

+0

@Jessy: Kod można zrobić lepiej. Nie zwracałem uwagi na część wejściową. Na przykład, właściwie nie potrzebujesz również cell2mat, po prostu użyj parametru "CollectOutput" (true) w textscan. Dodałbym również kod weryfikacyjny, aby upewnić się, że wszystkie pliki wejściowe mają taką samą liczbę wierszy (lub kod nie będzie działać). – yuk

+0

@Jessy, zaktualizowałem kod, gdy otrzymuję dostęp do MATLAB. – yuk

Powiązane problemy