MATLAB读取Argo数据【3】--一次性读取所有的dat文件的Argo信息

哈喽!大家好,这里是小Yang!
上一章向大家分享了如何从dat文件中获取需要的信息,这篇文章小Yang将向大家分享一下如何一次性读取dat文件夹重点的dat文件信息

一次性读取整个数据压缩包的dat文件数据

上一篇文章已经和大家分享了一下获取单个dat文件数据的方法。

然而,杭州Argo数据中心提供的一个压缩包里面是一个月所有Argo不同时刻的dat文件数据,比如:当我们需要在“201508”的dat文件夹中找到2015年8月位于南海的Argo数据时,是不可能逐个逐个跑dat文件,然后再去分析的,毕竟一个压缩包是包含上万个这样文件。

因此,我们需要在解压后的文件夹中,直接读取整个文件夹的所有dat文件,收集每个有效dat文件的相关信息,最后筛选出我们需要的dat文件。请添加图片描述那么话不多说,先上代码吧!

clc;clear;
path='E:\201508';  
addpath(path);% 添加路径
Filesname = dir(strcat(path)); % 找到当前路径文件夹下的以.dat为后缀的文件名,strcat是横向连接字符的函数
l=length(Filesname);
name=[];date=[];lon=[];lat=[];FileName=[];set=[];
for i=1:l-2
    try
        filename=Filesname(i+2).name;
        [A,B,C,D]=read_time_coord_from_dat(filename);
        LON=str2double(cell2mat(C));
        LAT=str2double(cell2mat(D));
        if LON >= 104 && LON <= 125 && LAT >= 4 && LAT <= 26
            name=[name;A];
            date=[date;B];
            lon=[lon;C];
            lat=[lat;D];
            FileName=[FileName;filename];
        end
    end
end
data_set=[date,lon,lat,name,cellstr(FileName)];
L=size(data_set,1);
for i=1:L
    rep=data_set(i,1);
    replace=char([rep{:}]);
    data_set(i,1)=cellstr(replace);
end

有不懂的地方没关系,下面小Yang一步步来讲解!

首先,在文件夹任意找一个dat文件,右键点击 ‘属性’ 复制粘贴其所在路径,然后用addpath来添加该路径。

path='E:\201508';  
addpath(path);

其次,用dir获取文件夹中的内容,小Yang在这里展示一下用dir读取的内容可以读取到的内容,得到的结构性数组中包括了六个参数,而如果我们需要遍历文件夹中的所有内容,就需要用到name中的文件名,然后代入小Yang上一篇文章的dat文件数据读取函数中。
请添加图片描述

我们先将dir获取到的内容存至Filesname中,并获取其长度以设置循环进行遍历,在再定义几个空矩阵来储存我们后面读取到的内容。

Filesname = dir(strcat(path)); % 找到当前路径文件夹下的以.dat为后缀的文件名,strcat是横向连接字符的函数
l=length(Filesname);
name=[];date=[];lon=[];lat=[];FileName=[];set=[];

之后就开始设置循环,进行遍历。

先获取每一次的文件名,然后代入小Yang上篇文章编写的dat读取函数read_time_coord_from_dat,获取该dat文件记录的Argo编号、记录数据时间、经度、纬度四个参数。其中,经度和纬度需要用cell2matstr2double来将元胞格式的数据转换为双精度的数组形式数据,从而能够在后面与数字进行对比和放到同一个矩阵中收集起来。

小Yang需要收集的是南海范围的Argo数据,大致划分一下南海的经纬度范围在104°E-125°E,4°N-26°N之间,因此可以设置 if 语句,若符合南海经纬度条件,就储存这些数据和文件名,如果不符则跳过。最后,再用cellstr将字符串式的文件名转化为元胞格式,从而能够储存在data_set中。

循环用了try语句,try的作用就是,如果某一次循环报错(可能是dat文件不完整导致),那么它会自动跳过该次循环,去读下一个dat文件,使得整个文件夹的dat文件读取过程不会被中断。

for i=1:l-2
    try
        filename=Filesname(i+2).name;
        [A,B,C,D]=read_time_coord_from_dat(filename);
        LON=str2double(cell2mat(C));
        LAT=str2double(cell2mat(D));
        if LON >= 104 && LON <= 125 && LAT >= 4 && LAT <= 26
            name=[name;A];
            date=[date;B];
            lon=[lon;C];
            lat=[lat;D];
            FileName=[FileName;filename];
        end
    end
end
data_set=[date,lon,lat,name,cellstr(FileName)];

把MATLAB的日期格式转化为能够被Excel所输出的形式

L=size(data_set,1);
for i=1:L
    rep=data_set(i,1);
    replace=char([rep{:}]);
    data_set(i,1)=cellstr(replace);
end

到目前为止,我们已经把这个dat文件夹的所有有效信息都读取完毕了,并储存至data_set中。但是如果我们就直接把data_set输出为Excel表格,我们会发现输出的Excel中,时间的那一列会是一片空白。小Yang最初也一直被这个问题所困扰,现在发现,是因为MATLAB转化的日期是datetime格式的,而datetime格式的数据不能直接输出为Excel所见。

换句话说,Excel中能够被表达的日期格式,只能是字符串形式的,因此我们需要把datetime格式的日期转化为字符串格式,并通过元胞来储存成一个整体

对于datetime转变为str,这一步小Yang也是摸索了好久,最后发现通过以下这三步,就能够实现datetime转化为char的字符串格式,再从char转化为cell格式来储存。

% rep就是某一个datetime格式的日期,这里只能设置循环一个一个处理,无法对全部datetime日期同时处理
rep=data_set(i,1);   
% 将rep转化为char的字符串格式
replace=char([rep{:}]);
% 再将字符串格式的日期用cell来储存
data_set(i,1)=cellstr(replace);

因此,再通过这个循环,最后data_set输出的Excel就能够把需要的信息都显示出来啦请添加图片描述以上就是这篇文章的全部内容,如果对你有帮助的话,可以收藏一下叭

那么下一篇文章,小Yang将会和大家分享一下—如何分析和利用Argo所测得的海洋数据!

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值