Reading specific data from a txt/csv file

2 visualizzazioni (ultimi 30 giorni)
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!

Risposta accettata

Matt Tearle
Matt Tearle il 27 Mar 2013
Modificato: Matt Tearle il 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 Commenti
Debjit Pal
Debjit Pal il 29 Mar 2013
Possibly before you store you can execute
>> format long
That will do the job I guess
Matt Tearle
Matt Tearle il 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.

Accedi per commentare.

Più risposte (1)

Seyedali Pourmoafi
Seyedali Pourmoafi il 25 Ott 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?

Categorie

Scopri di più su Large Files and Big Data in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by