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?
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
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):
Next, you have to reshape
data
using the known number of columns of data (not counting the date and time columns):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 remainingN
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: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.