mirage
mirage

Reputation: 145

Reading and Plotting from text files

I have some problems in reading data from text file and plotting it.The text file contains

Date; Time; Temp °C
05.08.2011; 11:00:47;23.75
05.08.2011; 11:01:21;23.69
05.08.2011; 11:01:56;25.69
05.08.2011; 11:02:16;23.63
05.08.2011; 11:02:50;23.63
05.08.2011; 11:03:24;23.63

I want to plot the Temperature values with elapsed minutes. firstly i used

[a,b]=textread('file1.txt','%s %s','headerlines',1)

to read the data in a string and I get

'17:09:16;21.75'

After that I used

a= strread('17:08:00;21.81','%s','delimiter', ';')

to get

'17:08:00'
'21.81'

But after this I am not been able to figure out how to move forward to deal with both these strings, especially time. I want to plot temperature with time on xaxis..but not this time the elapsed time..in this case 2 mins 37 secs. Help needed

Thanks Aabaz.thats really a big favor..I dun why I could figure it out ..I spent so much time on it I have some 50 files comprising this data..If i want to loop it under this code , how can accomplish it, cz i have names of the file under ROM IDs..alike 1AHJDDHUD1224.txt. How wud pass the file names in the loop.Do I have to change the names of the files then pass them under loop.I dun knw

I have one more question that if I wanted the values to be plotted after every 60 seconds..alike as soon the data is available in text files graph is plotted , and then graph is updated after every 60 sec until some more values are available in text file

Upvotes: 1

Views: 6829

Answers (2)

Amro
Amro

Reputation: 124563

Consider the following code. It will cycle through all .DAT files in a specific directory, read the data files, then plots with a the x-axis formatted as date/time:

%# get a list of files
BASE_DIR = 'C:\Users\Amro\Desktop';
files = dir( fullfile(BASE_DIR,'*.dat') );
files = {files.name};

%# read all files first
dt = cell(numel(files),1);
temps = cell(numel(files),1);
for i=1:numel(files)
    %# read data file
    fname = fullfile(BASE_DIR,files{i});
    fid = fopen(fname);
    C = textscan(fid, '%s %s %f', 'delimiter',';', 'HeaderLines',1);
    fclose(fid);

    %# datetime and temperature
    dt{i} = datenum( strcat(C{1},{' '},C{2}) );
    temps{i} = C{3};
end

Now we can plot the data (say we had 16 files, thus layout subplots as 4-by-4)

figure
for i=1:16
    subplot(4,4,i), plot(dt{i}, temps{i}, '.-')
    xlabel('DateTime'), ylabel('Temp °C')
    datetick('x','HH:MM:SS')
end

screenshot

Upvotes: 4

Aabaz
Aabaz

Reputation: 3116

You can merge the time strings with sprintf and translate them to seconds with datenum. Then the rest will be easy. Here is how it could work:

fid=fopen('data','r');
header=fgetl(fid);
data=textscan(fid,'%s','delimiter',';');
fclose(fid);
data=data{:};
day=data(1:3:end);
hour=data(2:3:end);
temp=str2double(data(3:3:end));
time=cellfun(@(x) sprintf('%s %s',day{strcmpi(hour,x)},x),hour,'uniformoutput',0);
% timev=datevec(time,'mm.dd.yyyy HH:MM:SS');
timen=datenum(time,'mm.dd.yyyy HH:MM:SS');
seconds=timen*86400;
plot(seconds-seconds(1),temp);

You may want to check the date format as I did not know which format you were using, so I guessed it was mm.dd.yyyy HH:MM:SS (see Matlab date specifiers)

Upvotes: 2

Related Questions