【问题标题】:Reading and Plotting from text files从文本文件中读取和绘图
【发布时间】:2011-09-22 13:33:18
【问题描述】:

我在从文本文件中读取数据并绘制它时遇到了一些问题。文本文件包含

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

我想用经过的分钟绘制温度值。 首先我用了

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

读取字符串中的数据,我得到

'17:09:16;21.75'

后来我用了

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

得到

'17:08:00'
'21.81'

但在此之后,我无法弄清楚如何继续处理这两个字符串,尤其是时间。 我想在 xaxis 上绘制温度与时间的关系..但这次不是经过的时间..在这种情况下是 2 分 37 秒。 需要帮助

感谢 Aabaz。这真是一个大忙。我不知道为什么我能弄明白 ..我花了这么多时间在上面 我有大约 50 个包含这些数据的文件..如果我想在这段代码下循环它,如何完成它,cz 我在 ROM ID 下有文件的名称..类似 1AHJDDHUD1224.txt。 wud如何在循环中传递文件名。我是否必须更改文件的名称然后在循环下传递它们。我不知道

我还有一个问题,如果我希望在每 60 秒后绘制一次值......只要数据在文本文件中可用,就会绘制图表,然后每 60 秒更新一次图表,直到更多的值在文本文件中可用

【问题讨论】:

    标签: matlab file-io plot


    【解决方案1】:

    考虑以下代码。它将循环遍历特定目录中的所有 .DAT 文件,读取数据文件,然后使用格式化为日期/时间的 x 轴进行绘图:

    %# 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
    

    现在我们可以绘制数据(假设我们有 16 个文件,因此将子图布局为 4×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
    

    【讨论】:

    • 谢谢 Amro..我已经尝试运行此代码,但它没有显示任何图表。我认为它没有正确读取文件。我给了这些文件的正确路径,但仍然没有输出。所有文件都是文本文件,我想要的是在一个屏幕上对它们进行子图,这意味着在一个图中有 16 到 17 个子图
    • 首先确保调整路径和文件名模式*.txt 以匹配您拥有的文件。然后我建议你使用一个单元格数组,并首先读取/存储所有数据。最后你可以使用任何你想要的配置来绘制它们......
    • 我还有一个问题,如果我希望在每 60 秒后绘制一次值......只要数据在文本文件中可用,图表就会被绘制,然后每 60 秒更新一次图表秒,直到文本文件中有更多值可用
    • 这个程序讨论何时创建新文件。在我的情况下,文本文件的内容每 60 秒修改一次,所以我想至少在 2 或 3 分钟后访问文件内容.所以我可以在更新文本文件中的值时移动我的情节
    【解决方案2】:

    您可以使用sprintf 合并时间字符串,并使用datenum 将它们转换为秒。那么剩下的就很容易了。以下是它的工作原理:

    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);
    

    您可能想检查日期格式,因为我不知道您使用的是哪种格式,所以我猜是mm.dd.yyyy HH:MM:SS(请参阅Matlab date specifiers

    【讨论】:

    • 感谢 Aabaz。这真是一个大忙。我不知道为什么我能弄清楚 ..我花了这么多时间在上面我有大约 50 个文件包含这些数据..如果我想循环它在此代码下,如何实现它,cz 我在 ROM IDs..alike 1AHJDDHUD1224.txt 下有文件的名称。 wud如何在循环中传递文件名。我是否必须更改文件的名称然后在循环下传递它们。我不知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多