I have asked a related question in the past and I know how to read the file thanks to the help of the experts here. Now I have a new problem. I first read the data from the file like so:
fid = fopen('D:\file.txt', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);
I then process the file and change a few values of the column. Now I want to write a new file newfile.txt
in the exact same format as my file.txt
with the new values. How do I do that?
If I do the following:
M = [datenum(a{1}) a{2}];
dlmwrite('newfile1.txt', M);
it gives me a new file without my first row of headers and without column 1 and column2 in the format I want.
My file format is given below:
date time, M01, M02, M03, M04, M05, M06
8/15/2009, 0:00:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009, 0:10:00, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009, 0:20:00, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009, 0:30:00, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009, 0:40:00, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009, 0:50:00, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009, 1:40:00, 7, 7, 7.2, 6.9, 0, 6.3
i am able to make a new file.txt in format
My file format is given below:
5.8, 7.8, 7.8, 7.3, 0, 7.9
7.1, 8.1, 8.1, 7.7, 0, 8.1
6.8, 7.4, 7.6, 7.1, 0, 7.3
5.6, 6.8, 7.1, 6.6, 0, 6.8
3.9, 6.2, 6.4, 6.2, 0, 6.4
4.6, 5.5, 6.1, 5.8, 0, 5.6
7, 7, 7.2, 6.9, 0, 6.3
Can some one help me 2 copy the headers and the first 2 columns into this new file?
Note: I've updated the answer to work with the most current file format specified in the question (i.e. a comma between the date and time values). I've also written the code below to handle very large files where the number of columns are known but the number of rows is variable.
First, you'll have to read your file using the following updated code (which saves the top line using the function FGETS):
fid = fopen('D:\file.txt','rt'); %# Open the file
topLine = fgets(fid); %# Read the top line and store it in a string
data = textscan(fid,'%f','Delimiter',',/:'); %# Read the data
fclose(fid); %# Close the file
Next, you have to reshape data
using the known number of columns of data (not counting the date and time columns):
N = 74; %# Number of columns of data after the date and time
data = reshape(data{1},N+6,[])';
Now data
is a matrix where the first six columns contain date and time information (month, day, year, hours, minutes, and seconds) and all the other data is in the remaining N
columns. If you need to do anything with the date and time values, you can look at the following functions to figure out how to convert them to different formats: DATENUM, DATESTR, and DATEVEC.
After you've modified the values in data
you can resave it using a for loop and the FPRINTF function:
fid = fopen('newfile1.txt','wt'); %# Open the file
fprintf(fid,'%s',topLine); %# Print the top line
for i = 1:size(data,1) %# Loop over the rows of data
fprintf(fid,'%d/%d/%d, %d:%d:%d',data(i,1:6)); %# Print the date
fprintf(fid,', %.1f',data(i,7:end)); %# Print the data
fprintf(fid,'\n'); %# Print a newline
end
fclose(fid); %# Close the file
I ran the above code with an 86400-by-80 matrix for data
and it took around 30 seconds to write the data to a file.
dlmwrite writes a variable (for example, your array of M) to a file in ASCII text, as you know. Check the documentation for the function to discover how to set the separator character (to get , between values in each row) and how to append to an existing file.
To write the header line, I suggest you set up an array of strings, populate it and use dlmwrite to write it to your output file.
Now, if you want to write the rest of the file (the M array plus 2 leading columns of dates/times) you will need to create a temporary array with size the same as M plus 2 extra columns. Since your data values are floating-point numbers and your dates and times are structured data of some sort (strings perhaps) I think Mtemp will have to be an array of strings. Once you have created it you can append it to your output file with a single dlmwrite statement.
Note that num2str operates as you might hope on vectors but I'm not sure it can be coerced into putting , between values. It can, however, write numbers in a format you specify.
If this doesn't give you the output you want, or your array is too big to copy and expand or you have some other reason for not liking the proposed solution, then I fear that you will have to write a loop to write the output a line at a time, and use low-level file writing functions.
Regards
Mark