views:

175

answers:

1

I have 3 txt files s1.txt, s2.txt, s3.txt.Each have the same format and number of data.I want to combine only the second column of each of the 3 files into one file. Before I combine the data, I sorted it according to the 1st column:

UnSorted 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

Sorted 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

Here is the code I have so far:

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

How can I get the output in the new txt file in this format?

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

instead of this format?

23    
55    
32   
22
10    
33
32
11
11
22
28
11
+3  A: 

Create the output matrix first, then write it to the file.

Here is the new 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: Actually to write only numbers to a file you don't need FPRINTF. Use DLMWRITE instead:

dlmwrite('RT.txt',C,'\t')
yuk
@yuk ..Thank you very much...your code are so neat and tidy and it works!! :) you've just made my day! Thank you..
Jessy
@Jessy: The code can be done better. I didn't pay much attention to input part. For example, you actually don't need cell2mat as well, just use 'CollectOutput' parameter (true) in textscan. I would also add validation code to make sure all input files have the same number of rows (or the code will not work).
yuk
@Jessy, I updated the code as I get access to MATLAB.
yuk
@yuk: Thanks ...I wonder why this msg --> 'Input files have different number of rows' come out when I removed the sortrows? and it doesn't when I didn't remove the sortrows?
Jessy
@Jessy: This line also extracts double matrix from cell array. If you want to remove sortrows, add `B = A{:};`.
yuk