Reading specific data from a txt/csv file
3 views (last 30 days)
Show older comments
Hissam Aziz
on 27 Mar 2013
Answered: Seyedali Pourmoafi
on 25 Oct 2020
Hi Everyone, i'm relatively new to Matlab and this is my first post on Mathworks! Wohoo! Will be grateful for any help!
So i'm trying to read data generated from a device which measures the energy consumption. When the csv/text file is generated it looks like this:
03/27/2013 11:20:46.000000000 PM;0.46957; 0.00002
03/27/2013 11:20:46.000083201 PM;0.45180; 0.00000
03/27/2013 11:20:46.000166402 PM;0.45180; 0.00007
My aim is to read "11:20:46.000000000" as a time stamp (the hour can be removed, all the need are the minutes and seconds" and "0.46957" as the power consumed, continuously for each row. This data will eventually be plotted and after curve fitting an integral.
I'm not sure how to how to achieve this. How do i read the time, and the energy? How do i read the time so that it can be considered as data and plotted? The file is huge, around 300 Megabytes. I can read simple csv files sure, but this file is structured strange and generated from C++ and i'm not sure i can change anything within the code, nor am i allowed to make any changes :S so the csv file will stay as is. Any help would be greatly appreciated! Thank you!
0 Comments
Accepted Answer
Matt Tearle
on 27 Mar 2013
Edited: Matt Tearle
on 27 Mar 2013
If you have a recent version of MATLAB, you can use the Import Tool to do it interactively, then generate the code. Or you can jump straight to the joy of the textscan function!
Do you need the dates at all? It sounds like the only time information you want is minutes and seconds. So:
fid = fopen('filename.txt');
rawdata = textscan(fid,'%*s %*f %f %f %*s %f %*f','delimiter',{' ',';',':'},...
'MultipleDelimsAsOne',true);
times = rawdata{1} + rawdata{2}/60;
powconsumed = rawdata{3};
fid = fclose(fid);
This treats the file as a string (the date) followed by a space delimiter, followed by three numbers separated by a : delimiter, followed by a space delimiter and another string ("PM"), then two numbers separated by a ; delimiter. The * characters in the format string tell textscan to ignore those fields, so it just reads the minute, second, and power fields. I'm also converting minutes and seconds to a decimal minute (minute + second/60). You can change that to whatever you want -- keep them separate if you want.
4 Comments
Debjit Pal
on 29 Mar 2013
Possibly before you store you can execute
>> format long
That will do the job I guess
Matt Tearle
on 1 Apr 2013
There's an important distinction between how MATLAB stores numbers and how they are displayed. But default, numbers are stored as double precision in MATLAB (about 16 decimals) but displayed to the Command Window to 4 d.p. If you use %f in textscan, you'll get doubles. If you want to see more decimals in the display, you can use the format command to set the default display format, as Debjit Pal suggests, or use something like fprintf to print values out to a fixed format.
More Answers (1)
Seyedali Pourmoafi
on 25 Oct 2020
Hi everyone,
I want to read so specific data from a CSV file and there are not numeric formats, there are some names. could you please help me in this regard? How can I do it?
0 Comments
See Also
Categories
Find more on Large Files and Big Data in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!