2010-05-27 7 views
6

J'ai 3 fichiers txt s1.txt, s2.txt, s3.txt .Chacun ont le même format et le même nombre de données.Je veux combiner uniquement la deuxième colonne de chacun des 3 fichiers en un seul fichier. Avant que je combiner les données, je triais en fonction de la 1ère colonne:Comment enregistrer des données dans un fichier .txt dans MATLAB

fichier DECLASSES: 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 

fichier Classé: 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 

Voici le code que j'ai jusqu'à présent:

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

Comment puis-je obtenir la sortie dans le nouveau fichier txt dans ce format?

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

au lieu de ce format?

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

Répondre

10

Créez d'abord la matrice de sortie, puis écrivez-la dans le fichier.

Voici le nouveau 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: En fait à écrire des chiffres à un fichier que vous n'avez pas besoin fprintf. Utilisez DLMWRITE à la place:

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

.Merci beaucoup ... votre code sont si propre et bien rangé et il fonctionne !! :) tu viens de faire ma journée! Merci .. – Jessy

+0

@Jessy: Le code peut être mieux fait. Je n'ai pas prêté beaucoup d'attention à la partie entrée. Par exemple, vous n'avez pas besoin de cell2mat, utilisez simplement le paramètre 'CollectOutput' (true) dans textscan. J'ajouterais aussi du code de validation pour m'assurer que tous les fichiers d'entrée ont le même nombre de lignes (ou que le code ne fonctionnera pas). – yuk

+0

@Jessy, j'ai mis à jour le code que j'ai accès à MATLAB. – yuk