tags:

views:

75

answers:

1

In the sample text file below, if column 3 contains a 1 then the corresponding data of column 2 should be merged with the data of the previous row in column 2. For example, the 40 in row 2 should be added to the 10 in row 1, then row 2 should be set to 0 (as shown in the modified sample text file). The problem with my code below is that it only records changes in the current data time(i,1) but not the changes made for the previous data.

original.txt    
    a  time c
    1  10   0
    2  40   1
    3  20   0
    4  11   0
    5  40   1

modified.txt    
    a  time c
    1  50   0
    2  0    0
    3  20   0
    4  51   0
    5  0    0




fid=fopen('data.txt');
A=textscan(fid,'%f%f%f');

a   =A{1};
time=A{2};
c   =A{3};

fclose(fid);

fid=fopen('newData.txt','wt');

for i=1:size(a)
  if c(i,1)==1
    time(i-1,1)=time(i,1)+time(i-1,1); % merge the time of the current and the previous
    time(i,1)  =0; %set the time to 0

    array = []; %empty the array
    array = [a(i,1) time c(i,1)]; add new data
    format short g;
    fprintf(fid,'%g\t %g\t %g\n',array);
end
fclose(fid)
A: 

The reason the current time value is written properly but the previous one isn't is because you have already written the previous one to the file on the previous loop iteration, so there is no way for you to change it. You need to remove the printing from within the loop and add it after you adjust all of the time values.

You can also take advantage of vectorization by using the FIND function instead of a for loop. You also only need one call to FPRINTF to output all the data. Try this:

a = [1; 2; 3; 4; 5];          %# Sample data
time = [10; 40; 20; 11; 40];  %# Sample data
c = [0; 1; 0; 0; 1];          %# Sample data

index = find(c == 1);                %# Find indices where c equals 1
temp = time(index);                  %# Temporarily store the time values
time(index) = 0;                     %# Zero-out the time points
time(index-1) = time(index-1)+temp;  %# Add to the previous time points
c(index) = 0;                        %# Zero-out the entries of c

fid = fopen('newData.txt','wt');              %# Open the file
fprintf(fid,'%g\t %g\t %g\n',[a time c].');  %'# Write the data to the file
fclose(fid);                                  %# Close the file
gnovice
Thanks gnovice..if I have thousand of line is it possible to use vector?
Jessy
@Jessy: The above code should handle vectors with thousands of elements without any problem. One warning, though: if `c` has ones right next to each other, you may get unexpected results. For example, `time = [20; 10; 10];` and `c = [0; 1; 1];` will give you a result of `time = [30; 0; 0];`, not `time = [30; 10; 0];`. Is that going to be OK?
gnovice
@gnovice: Thanks. But I really need the time=[30;10;0] :(
Jessy
@Jessy: Not a problem. I updated the code to give you the output you need. ;)
gnovice
@gnovice: Thanks :) ..but I have a little problem. The new data were written not in the same format with the orginal file..e.g. all data of 'a' written first in many column not just in one column, similarly with 'time' and ' c'.
Jessy
@gnovice: Thanks...I think I know...I just transform the array ... thanks gNovice :)
Jessy
if I want to add the modified time as a new column in a new file, and let the existing 'time' unmodified, how can I do that?
Jessy
@Jessy: Before you modify `time`, copy it to another variable, like `oldTime = time;`. Then, you can add it as another column in the file by changing the second to last line of my above code to `fprintf(fid,'%g\t %g\t %g\t %g\n',[a oldTime time c].');`.
gnovice