views:

1782

answers:

2
datetime, M01, M02, M03, M04, M05, M06
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009 1:40, 7, 7, 7.2, 6.9, 0, 6.3

Can you help me to read this CSV file properly so I can convert the first column into a string using datenum? csvread of course does not work. With textscan I am lost how to call it , so I do not get errors. The date and time are in the same column.

Sorry it might sound a dumb question!!!

I know how to read read the above file now. but how do i write it back in a file.txt in the exact same format?? i mean i modified some columns and now need a similar file with same format for column 1 and row 1. Thanks for the help

A: 

TEXTSCAN by itself won't convert the date, but you can call DATENUM on just the column that needs it.

f = fopen('datafile.txt');
data = textscan(f, '%s %f %f %f %f %f %f', 'Delimiter', ',', 'HeaderLines', 1);
fclose(f);
data{1} = datenum(data{1});

will return a cell array data of doubles where the first column is the MATLAB datenum corresponding to each date, and each other column is the corresponding column from the file.

mtrw
Thanks....................
AP
+3  A: 

According to your comment above, if the data looks like:

datetime, M01, M02, M03, M04, M05, M06
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009 1:40, 7, 7 7.2, 6.9, 0, 6.3

then use the following to read it as a matrix:

fid = fopen('file.csv', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
      'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);

M = [datenum(a{1}) a{2}]

... and the output I get:

format short g
M =
    7.34e+005        5.8        7.8        7.8        7.3          0        7.9
    7.34e+005        7.1        8.1        8.1        7.7          0        8.1
    7.34e+005        6.8        7.4        7.6        7.1          0        7.3
    7.34e+005        5.6        6.8        7.1        6.6          0        6.8
    7.34e+005        3.9        6.2        6.4        6.2          0        6.4
    7.34e+005        4.6        5.5        6.1        5.8          0        5.6
    7.34e+005          7          7        7.2        6.9          0        6.3

if you set the display format to a long output, you will see the full numbers (note they are still stored in full), or use fprintf:

>> fprintf('%.9f\n', M(:,1))
734000.000000000
734000.006944445
734000.013888889
734000.020833333
734000.027777778
734000.034722222
734000.069444445
Amro
i had used a similar code and even when i copy your code get the same result7.340000000000000 0.000058000000000 0.000078000000000 7.340000069444445 0.000071000000000 0.000081000000000 7.340000138888889 0.000068000000000 0.000074000000000i have just copied the result of 3 rows n columns of the o/pwhy are the numbers divided by 100000 ? when i try to do M= [datenum(a(1)) a (2)] i get strange ans.also when i change the dates i get the same set of string in column 1 ,so i do not know what is happening.Any clues?
AP
@AP: I updated my post to answer your question
Amro
Thanks a lot. you rock!! It works now.Can you explain me what the 'rt' , 'collectoutput' does? g after format short does?you are awesome !!
AP
You should simply consult the documentation for each function. `rt` stands for read and text mode (as opposed to binary mode). `collectoutput`: concatenates consecutive output cells with the same data type into a single array. `format short g`: uses best of fixed or floating point format (110.1 vs 1.1010e+002)
Amro